怎样选择所画的椭圆? 选择椭圆的边线? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 两种方法: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; 另一种方法:1. 平移捕捉点p和椭圆,使得椭圆的中心位于坐标原点。p变为 p12. 旋转椭圆和p,使得椭圆轴a和x轴重合。p1 变为 p23. 是两相乘构成方程 (a*cos(alpha), b*sin(alpha)) * (P2x, P2y) = 0 求解 alpha4. 计算两个点之间的距离 (a*cos(alpha), b*sin(alpha)) 和 (P2x, P2y),如果距离小于 tolerance 则认为鼠标点在边线上 更正 “2. 旋转椭圆和p,使得椭圆轴a和x轴重合。p1 变为 p2”2. 旋转椭圆和p1,使得椭圆轴a和x轴重合。p1 变为 p2 VS2008如何为进度栏添加变量? bcgcontrolbar release便已报错 如何在VC中编辑PDF文件后在保存成PDF文件 求大家帮忙 如何根据一窗口句柄,得到dc,然后在dc上作图? 如何让edit box 在设成disable后不变灰,还是原来的白色(没办法,客户要这样) 各位各位:关于CreateProcess,请教! 界面需要不断刷新,闪烁怎么解决呢? 继承纯虚类时候,虚函数表的结构,请各位帮忙, 大家都在搞纯应用啊,没意思,理论方面呢? 请问高手,关于vc操作excel的一些难题!!急急急 帮忙看一下了
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. 旋转椭圆和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 则认为鼠标点在边线上
2. 旋转椭圆和p1,使得椭圆轴a和x轴重合。p1 变为 p2