中心法画椭圆(各种大小位置)

#include <winbgim.h>
#include <conio2.h>
#include <cmath>

void ellipseMP(int xcenter,int ycenter,int rx,int ry,float alpha);//alpha :椭圆绕中心点逆时针旋转的角度 (单位:弧度)
void ellipsePoints(int xcenter,int ycenter,int xpt,int ypt,float alpha);

int main()
{
     initwindow(640,480); //open a 640x480 graphics window

    ellipseMP(320,240,70,30,2.1);
     getch();   //wait for user to press a key
     closegraph();        //close graphics window
     return 0;
}


void ellipseMP(int xcenter,int ycenter,int rx,int ry,float alpha)
{
     int x2 = rx * rx,y2 = ry * ry;
     int x = 0,y = ry,p;
     int px = 0,py = 2 * x2 * y;
    
     ellipsePoints(xcenter,ycenter,x,y,alpha);
    
     /*region1*/
     p = y2 - x2 * ry + 0.25 * x2 + 0.5;
     while(px < py)
     {
              x++;
              px += 2 * y2;
             
              if(p < 0)
                   p += y2 + px;//or: p += y2 + 2 * y2 * x;
              else
                  {
                        y--;
                        py -= 2 * x2;
                        p += px + y2 - py;
                  }
             
              ellipsePoints(xcenter,ycenter,x,y,alpha);
     }
    
     /*region2*/
     p = y2 * (x + 0.5) * (x + 0.5) + x2 * (y - 1) * (y - 1) - x2 * y2 + 0.5;
     while(y > 0)
     {
              y--;
              py -= 2 * x2;
             
              if(p > 0)
                   p += x2 - py;
              else
                  {
                        x++;
                        px += 2 * y2;
                        p += px + x2 - py;
                  }
             
              ellipsePoints(xcenter,ycenter,x,y,alpha);
     }    
}

void ellipsePoints(int xcenter,int ycenter,int xpt,int ypt,float alpha)
{
     int x[4],y[4];
     //先旋转在四个象限的点 
     x[0] = xpt * cos(alpha) - ypt * sin(alpha);
     y[0] = xpt * sin(alpha) + ypt * cos(alpha);

     x[1] = -xpt * cos(alpha) + ypt * sin(alpha);
     y[1] = -xpt * sin(alpha) - ypt * cos(alpha);
    
     x[2] = xpt * cos(alpha) + ypt * sin(alpha);
     y[2] = xpt * sin(alpha) - ypt * cos(alpha);    

     x[3] = -xpt * cos(alpha) - ypt * sin(alpha);
     y[3] = -xpt * sin(alpha) + ypt * cos(alpha);    
    

     //输出四个点
     putpixel(xcenter + x[0],ycenter + y[0],RGB(255,0,0)); 
     putpixel(xcenter + x[1],ycenter + y[1],RGB(255,0,0)); 
     putpixel(xcenter + x[2],ycenter + y[2],RGB(255,0,0)); 
     putpixel(xcenter + x[3],ycenter + y[3],RGB(255,0,0));           
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值