mfc画圆算法
求半径:圆心一点:m_ptOrigin1,圆上一点:m_ptOrigin2
注释:这里的m_ptOrigin1,m_ptOrigin2均为Cpoint类型
R=int(sqrt(pow((m_ptOrigin1.x-m_ptOrigin2.x)*1.0,2)+pow((m_ptOrigin1.y-m_ptOrigin2.y)*1.0,2)));
传参注释:圆心坐标(px,py) 半径:r
//中点画圆
void CquhongjuanView::MidPointCircle(CDC*& pDC,int px,int py,int r)
{
int x,y;
double d;
x=0;y=r;d=1.25-r;
pDC->SetPixel(x+px,y+py,RGB(255,0,0)); //给像素点着色
while(x<=y)
{
if(d<0)
d+=2*x+3;
else {d+=2*(x-y)+5;y--;}
x++;
pDC->SetPixel((x+px),(y+py),RGB(255,0,0));
pDC->SetPixel((-x+px),(y+py),RGB(255,0,0));
pDC->SetPixel((x+px),(-y+py),RGB(255,0,0));
pDC->SetPixel((-x+px),(-y+py),RGB(255,0,0));
pDC->SetPixel((y+px),(x+py),RGB(255,0,0));
pDC->SetPixel((y+px),(-x+py),RGB(255,0,0));
pDC->SetPixel((-y+px),(x+py),RGB(255,0,0));
pDC->SetPixel((-y+px),(-x+py),RGB(255,0,0));
}
}
mfc中点画椭圆
1.椭圆长半轴:a 椭圆短半轴:b
事先知道:两个点:椭圆圆心、椭圆上任意一点(画椭圆时只点击两个点)
分别为m_ptOrigin1,m_ptOrigin2
int x,y;double k;
x=abs(m_ptOrigin2.x-m_ptOrigin1.x);
y=abs(m_ptOrigin2.y-m_ptOrigin1.y);
if(x==0||y==0)return;
k=(double)y/x;
a=(int)sqrt((k*k*x*x+y*y)/k/k);
b=int(a*k);
2.传入参数
椭圆圆心:(x0,y0)
void CquhongjuanView::draw_ellipse(CDC*& pDC,int x0,int y0,int a,int b)
{
int x=0,y=b;
pDC->SetPixel(x0+x,y0+y,RGB(255,0,0));
pDC->SetPixel(x0-x,y0+y,RGB(255,0,0));
pDC->SetPixel(x0+x,y0-y,RGB(255,0,0));
pDC->SetPixel(x0-x,y0-y,RGB(255,0,0));
//上部分
double d1=b*b+a*a*(-b+0.25);
while(b*b*x<a*a*y)
{
if(d1<0)
{
d1+=b*b*(2*x+3);
x++;
}else
{
d1+=(b*b*(2*x+3)+a*a*(-2*y+2));
x++;y--;
}
pDC->SetPixel(x0+x,y0+y,RGB(255,0,0));
pDC->SetPixel(x0-x,y0+y,RGB(255,0,0));
pDC->SetPixel(x0+x,y0-y,RGB(255,0,0));
pDC->SetPixel(x0-x,y0-y,RGB(255,0,0));
}
//下部分
double d2=sqrt((double)b*(x+0.5))+sqrt((double)a*(y-1))-sqrt((double)a*b);
while(y>0)
{
if(d2<0)
{
d2+=b*b*(2*x+2)+a*a*(-2*y+3);
x++;y--;
}else
{
d2+=a*a*(-2*y+3);
y--;
}
//draw_pixel_4(pDC,x0,y0,x,y,color);
pDC->SetPixel(x0+x,y0+y,RGB(255,0,0));
pDC->SetPixel(x0-x,y0+y,RGB(255,0,0));
pDC->SetPixel(x0+x,y0-y,RGB(255,0,0));
pDC->SetPixel(x0-x,y0-y,RGB(255,0,0));
}
}
效果图:
ps:其他相关直线、多边形、多边形填充,直线裁剪,多边形裁剪可以来我的博客里找