2017-03-01 148 views
1

我有两个坐标点,必须绘制一个圆。一点是中心,另一个在圆的边缘,所以基本上两点之间的距离就是圆的半径。我必须在MFC中执行此操作。我试过这个,但圆圈绘制不正确。通常它比它应该更大。根据两点绘制一个圆

double radius = sqrt((c->p1.x*1.0 - c->p1.y) * (c->p1.x - c->p1.y) + 
        (c->p2.x - c->p2.y) * (c->p2.x - c->p2.y)); 

CPen black(PS_SOLID,3,RGB(255,0,0)); 
pDC->SelectObject(&black); 

pDC->Ellipse(c->p1.x-radius , c->p1.y-radius, c->p1.x+radius, c->p1.y+radius); 

p1p2是点。该圆被画成一个矩形的圆环。 Ellipse()中的参数是矩形的左上角和右下角。

回答

2

您半径的计算是错误的......应该是:

double radius = sqrt(((c->p2.x - c->p1.x)*(c->p2.x - c->p1.x)) 
        +((c->p2.y - c->p1.y)*(c->p2.y - c->p1.y))); 
2

这里是计算半径的实现,这是更易于阅读(正确):

#include <cmath> 

int findRadius(const CPoint& p1, const CPoint& p2) { 
    // Calculate distance 
    CPoint dist{ p2 }; 
    dist -= p1; 
    // Calculate radius 
    double r = std::sqrt((dist.x * dist.x) + (dist.y * dist.y)); 
    // Convert to integer with appropriate rounding 
    return static_cast<int>(r + 0.5); 
} 

你可以使用你的渲染代码:

int radius = findRadius(c->p1, c->p2); 
CPen black(PS_SOLID, 3, RGB(255, 0, 0)); 
// Save previously selected pen 
CPen* pOld = pDC->SelectObject(&black); 
pDC->Ellipse(c->p1.x - radius, c->p1.y - radius, 
       c->p1.x + radius, c->p1.y + radius); 
// Restore DC by selecting the old pen 
pDC->SelectObject(pOld);