中点椭圆算法的实现

        中点椭圆算法和中点画圆算法的原理挺相似的。决策参数的计算过程也相近。本人在codeblocks下用win32 api写了简单的演示程序,但是发现了一些问题,稍后提出。

#include <windows.h>
#include <math.h>

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
void EllipsePlotPoints (HDC hdc, int xc, int yc, int x, int y);
void EllipseMidpoint (HDC hdc, int xc, int yc, int rx, int ry);

/*  Make the class name into a global variable  */
char szClassName[ ] = "CodeBlocksWindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Bresenham生成算法是一种用于绘制直线的算法,但是它也可以用于绘制椭圆椭圆中点Bresenham生成算法是一种基于中点画线法的算法,它可以在画椭圆时减少计算量和误差。 算法的基本思想是,先将椭圆分成四个象限,对每个象限分别进行绘制。对于每个象限,先从椭圆中心点开始,向椭圆的顶部和底部绘制两条线段,然后分别在这两条线段上选择一个点作为新的中心点,再向左右两侧绘制两条线段。重复这个过程,直到椭圆的边界被完全绘制。 具体的算法流程如下: 1. 计算椭圆的参数a和b,其中a是椭圆的长轴长度,b是椭圆的短轴长度。 2. 初始化椭圆中心点和第一条线段的两个端点。 x0 = 0; y0 = b; x1 = 0; y1 = -b; 3. 对于每个象限,重复以下步骤: 3.1. 绘制从中心点到第一条线段端点的线段。 3.2. 计算下一个中心点的位置,选择上一步绘制的线段上距离中心点最近的像素。 3.3. 绘制从新的中心点到第二条线段端点的线段。 3.4. 计算下一个中心点的位置,选择上一步绘制的线段上距离中心点最近的像素。 4. 当所有象限的边界被绘制完毕时,椭圆的边界也被完全绘制。 注意事项: 1. 所有计算都应该使用整数运算,避免浮点运算带来的误差。 2. 为了避免重复计算,可以事先预处理出椭圆的参数,如椭圆的半轴长度、半径等。 3. 在绘制线段时,可以使用Bresenham直线算法来计算像素点的位置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值