求通过鼠标左键按下和释放确定两个点求出另外三个点而画出正五角星的算法 MFC作图,在窗口中鼠标左键通过按下和释放确定两个点,这两个点正好为五角星不相邻的两个顶点,希望能通过这两个点确定另外的三个点而确定一个正五角星。在数学上可以用二元二次方程求坐标,但在程序中解二元二次方程不太适用,求高手给个求另外三点的算法。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 int g____times = 0;double g____x1, g____y1, g____x2, g____y2;#define PI (3.14159)void drawfive( CClientDC *dc ){ dc->Ellipse( g____x2 - 2, g____y2 - 2, g____x2 + 2, g____y2 + 2 ); // p1, p2的中间点 double tx1, ty1; tx1 = ( g____x1 + g____x2 ) / 2; ty1 = ( g____y1 + g____y2 ) / 2; //dc->Ellipse( tx1 - 2, ty1 - 2, tx1 + 2, ty1 + 2 ); //dc->MoveTo( g____x1, g____y1 ); //dc->LineTo( g____x2, g____y2 ); // 计算p1, p2的角度 double angle; angle = ( g____y2 - g____y1 ) / ( g____x2 - g____x1 ); if( angle > 1000000.0 ) { angle = PI / 2 ; } else { angle = atan( angle ); } angle += PI / 2; double g____cx, g____cy; double e; // 中间点到圆心的距离 double t; // p1, p2两点的距离的一半 t = sqrt( ( g____y2 - g____y1 ) * ( g____y2 - g____y1 ) + ( g____x2 - g____x1 ) * ( g____x2 - g____x1 ) ); t /= 2.0; e = t * 1.3763819204711735382072095819109; // 画出圆心 g____cx = tx1 + e * cos( angle ); g____cy = ty1 + e * sin( angle ); dc->Ellipse( g____cx - 2, g____cy - 2, g____cx + 2, g____cy + 2 ); // 计算第一个点到圆心的角度 angle = atan( ( g____y1 - g____cy ) / ( g____x1 - g____cx ) ); angle += ( PI / 5 ); // 计算5个点的坐标 double x[ 5 ], y[ 5 ]; double r; r = sqrt( ( g____y2 - g____cy ) * ( g____y2 - g____cy ) + ( g____x2 - g____cx ) * ( g____x2 - g____cx ) ); int i; for( i = 0; i < 5; i++ ) { x[ i ] = g____cx + r * cos( angle ); y[ i ] = g____cy + r * sin( angle ); angle += ( PI * 2 / 5 ); dc->Ellipse( x[ i ] - 2, y[ i ] - 2, x[ i ] + 2, y[ i ] + 2 ); } int j; for( i = 0; i < 5; i++ ) { j = ( i + 2 ) % 5; dc->MoveTo( x[ i ], y[ i ] ); dc->LineTo( x[ j ], y[ j ] ); }}void CTestFiveDlg::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if( g____times % 2 ) { g____x2 = point.x; g____y2 = point.y; CClientDC dc( this ); drawfive( &dc ); } else { g____x1 = point.x; g____y1 = point.y; CClientDC dc( this ); dc.Ellipse( g____x1 - 2, g____y1 - 2, g____x1 + 2, g____y1 + 2 ); } g____times++; CDialog::OnLButtonUp(nFlags, point);} 为什么SQLGetInstalledDrivers函数只能获得sql server这一个驱动 VC WebBrowser问题 怎样动态创建数据结构 不重载怎么给按纽加OnLButtonDown,OnLButtonUp事件?能吗? 100分求救:关于socket中write() 出错 ,在线等 又没有把十进制专程16进制和8进制的函数 请教一个汇编问题 opencv 的haar特征的adaboo训练 求助!!!急 how to 怎样在线程中修改状态栏 TCP 可以实现P2P打洞吗? ARToolkit!!!用到ARToolkit后贴opengl纹理出现问题!
double g____x1, g____y1, g____x2, g____y2;#define PI (3.14159)void
drawfive( CClientDC *dc )
{
dc->Ellipse( g____x2 - 2, g____y2 - 2, g____x2 + 2, g____y2 + 2 ); // p1, p2的中间点
double tx1, ty1; tx1 = ( g____x1 + g____x2 ) / 2;
ty1 = ( g____y1 + g____y2 ) / 2; //dc->Ellipse( tx1 - 2, ty1 - 2, tx1 + 2, ty1 + 2 );
//dc->MoveTo( g____x1, g____y1 );
//dc->LineTo( g____x2, g____y2 ); // 计算p1, p2的角度
double angle;
angle = ( g____y2 - g____y1 ) / ( g____x2 - g____x1 );
if( angle > 1000000.0 )
{
angle = PI / 2 ;
}
else
{
angle = atan( angle );
} angle += PI / 2; double g____cx, g____cy;
double e; // 中间点到圆心的距离
double t; // p1, p2两点的距离的一半 t = sqrt( ( g____y2 - g____y1 ) * ( g____y2 - g____y1 ) + ( g____x2 - g____x1 ) * ( g____x2 - g____x1 ) ); t /= 2.0; e = t * 1.3763819204711735382072095819109; // 画出圆心
g____cx = tx1 + e * cos( angle );
g____cy = ty1 + e * sin( angle );
dc->Ellipse( g____cx - 2, g____cy - 2, g____cx + 2, g____cy + 2 ); // 计算第一个点到圆心的角度
angle = atan( ( g____y1 - g____cy ) / ( g____x1 - g____cx ) );
angle += ( PI / 5 ); // 计算5个点的坐标
double x[ 5 ], y[ 5 ];
double r; r = sqrt( ( g____y2 - g____cy ) * ( g____y2 - g____cy ) + ( g____x2 - g____cx ) * ( g____x2 - g____cx ) );
int i;
for( i = 0; i < 5; i++ )
{
x[ i ] = g____cx + r * cos( angle );
y[ i ] = g____cy + r * sin( angle ); angle += ( PI * 2 / 5 ); dc->Ellipse( x[ i ] - 2, y[ i ] - 2, x[ i ] + 2, y[ i ] + 2 );
} int j;
for( i = 0; i < 5; i++ )
{
j = ( i + 2 ) % 5;
dc->MoveTo( x[ i ], y[ i ] );
dc->LineTo( x[ j ], y[ j ] );
}
}void CTestFiveDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if( g____times % 2 )
{
g____x2 = point.x;
g____y2 = point.y; CClientDC dc( this );
drawfive( &dc );
}
else
{
g____x1 = point.x;
g____y1 = point.y;
CClientDC dc( this ); dc.Ellipse( g____x1 - 2, g____y1 - 2, g____x1 + 2, g____y1 + 2 );
}
g____times++;
CDialog::OnLButtonUp(nFlags, point);
}