2017-03-01 1 views
1

J'ai deux points avec leurs coordonnées et je dois dessiner un cercle. Un point est le centre et l'autre est sur le bord du cercle, donc, fondamentalement, la distance entre les deux points est le rayon du cercle. Je dois le faire dans MFC. J'ai essayé ceci, mais le cercle n'est pas dessiné correctement. Habituellement, c'est plus grand que ce qu'il devrait être.Dessine un cercle basé sur deux points

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); 

p1 et p2 sont des points. Le cercle est dessiné comme un cercle dans un rectangle. Les arguments dans Ellipse() sont les coins supérieur gauche et inférieur droit d'un rectangle.

Répondre

2

vos calculs de rayon est mal ... il devrait être:

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

Voici une implémentation pour calculer le rayon, qui est plus facile à lire (et corriger):

#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); 
} 

Vous pouvez l'utiliser à partir de votre code de rendu:

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);