选择椭圆的边线?

解决方案 »

  1.   

    两种方法:
    1。可以通过该点到椭圆两焦点的距离之和d1+d2 是否大于椭圆长轴 2a。
    在计算机中表示鼠标所在点是否在椭圆上,可以考虑一个容忍值 tolerance。
    因为一个人在操纵鼠标时不可能在短时间内准确地选中椭圆上的点。
       if (d1 + d2 > 2a+ tolerance && d1 + d2 < 2a - tolerance ) 
         fetch the ellipse 
      else 
         not fetch the ellipse.2。将条件点的x代入方程求得y解看看是不是与条件点的y值相似。
       将条件点的y代入方程求得x解看看是不是与条件点的x值相似。
    代码如下:
     
    // 计算椭圆AB轴
    double dbAShaft = CMathAssistant::CalcDistanceOfTwoPoints( cAssistantPoints[0], cAssistantPoints[2] ) / 2;
    double dbBShaft = CMathAssistant::CalcDistanceOfTwoPoints( cAssistantPoints[1], cAssistantPoints[3] ) / 2; // 计算椭圆倾斜角正弦及余弦值
    double dbSinValue = ( cAssistantPoints[1].y - cAssistantPoints[3].y ) / ( 2 * dbBShaft );
    double dbCosValue = ( cAssistantPoints[1].x - cAssistantPoints[3].x ) / ( 2 * dbBShaft ); // 通过平移旋转将点转换为标准点
    double dbMouse_X = cPoint.x - ( m_pcCharacterPoints[0].x + m_pcCharacterPoints[2].x ) / 2;
      double dbMouse_Y = cPoint.y - ( m_pcCharacterPoints[0].y + m_pcCharacterPoints[2].y ) / 2;
    double dTempX = dbMouse_X * dbSinValue -  dbMouse_Y * dbCosValue;
    double dTempY = dbMouse_X * dbCosValue + dbMouse_Y * dbSinValue; // 判断点横坐标是否大于A轴及判断点纵坐标是否大于B轴
    if ( dTempX > dbAShaft || dTempX < - dbAShaft ||
    dTempY > dbBShaft || dTempY < - dbBShaft )
    return FALSE;
    double dSquA = dbAShaft * dbAShaft;
    double dSquB = dbBShaft * dbBShaft; // 将测试点横坐标代入椭圆方程求得值与测试点纵坐标比较,如果近似则返回真
    double dTempX1 = sqrt( dSquA - ( dTempY * dTempY * dSquA ) / dSquB );
    if ( fabs( dTempX1 - dTempX ) < DELTA_DISTANCE ||
     fabs( dTempX1 + dTempX ) < DELTA_DISTANCE )
    return TRUE; // 将测试点纵坐标代入椭圆方程求得值与测试点横坐标比较,如果近似则返回真
    double dTempY1 = sqrt( dSquB - ( dTempX * dTempX * dSquB ) / dSquA );
    if ( fabs( dTempY1 - dTempY ) < DELTA_DISTANCE ||
     fabs( dTempY1 + dTempY ) < DELTA_DISTANCE )
    return TRUE;
    return FALSE;
      

  2.   

    另一种方法:1. 平移捕捉点p和椭圆,使得椭圆的中心位于坐标原点。p变为 p1
    2. 旋转椭圆和p,使得椭圆轴a和x轴重合。p1 变为 p2
    3. 是两相乘构成方程 (a*cos(alpha), b*sin(alpha)) * (P2x, P2y) = 0 求解 alpha
    4. 计算两个点之间的距离 (a*cos(alpha), b*sin(alpha)) 和 (P2x, P2y),如果距离小于 tolerance 则认为鼠标点在边线上
      

  3.   

    更正 “2. 旋转椭圆和p,使得椭圆轴a和x轴重合。p1 变为 p2”
    2. 旋转椭圆和p1,使得椭圆轴a和x轴重合。p1 变为 p2