mfc 画圆算法 画椭圆算法

7 篇文章 9 订阅

 

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:其他相关直线、多边形、多边形填充,直线裁剪,多边形裁剪可以来我的博客里找 

  • 2
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值