当前位置:首页 > 代码 > 正文

vc直接生成椭圆函数图像程序代码(椭圆图像是函数图像吗)

admin 发布:2022-12-19 23:18 184


本篇文章给大家谈谈vc直接生成椭圆函数图像程序代码,以及椭圆图像是函数图像吗对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

c#椭圆代码

如何基于C#实现椭圆绘制

马燕鹏 王文新

通常所用的光栅显示器可看成是一个像素点阵的集合,绘图软件绘制椭圆就是在此集合中寻找最逼近椭圆弧的点并按给定颜色显示的过程。输入参数一般为椭圆的外接矩形而非椭圆方程,但可通过该矩形算出它的长、短半轴和椭圆中心,即得到了所绘椭圆的方程。

由于标准椭圆(中心在原点的椭圆)具有对称性,找到第一象限的逼近点根据对称关系就可得到其他象限的逼近点,所以绘制椭圆时先寻找对应标准椭圆的逼近点,然后平移回椭圆的中心,从而能够简化计算提高效率。

标准椭圆的方程为 ,即 。对其求导得,可见椭圆弧的斜率从0到。以斜率 即 为界把椭圆弧分成两部分,第一部分可得 , 的变化量小于的变化量,应以递增步长来确定,第二部分可得,的变化量小于的变化量,应以递增步长来确定。

对于第一部分,假设已知点为则下一点在其右方点或右下方点中选择离椭圆弧最近的点,而为右方点到椭圆弧的距离,为右下方点到椭圆弧的距离,通过做差:

可判断出所要选择的点,即:选择右方的点,选择右下方的点。根据所得到的利用上述思想推下一点即可得到与的递推关系式:

根据递推关系式和已知点利用循环就可得到第一部分所有的点,循环的条件为即。

对于第二部分,假设已知点为则下一点在其上方 点或左上方点中选择离椭圆弧最近的点,而为上方点到椭圆弧的距离,为左上方点到椭圆弧的距离,通过做差:

可判断出所要选择的点,即:选择上方的点,选择左上方的点。根据所得到的利用上述思想推下一点即可得到 与的递推关系式:

根据递推关系式和已知点利用循环就可得到第二部分所有的点,循环的条件为即。

通过分析可把绘制椭圆的功能封装到一个类(如TDrawEllipse)中,利用构造函数初始化要绘制椭圆的位图,利用公有方法Draw来绘制椭圆,该方法首先计算椭圆的长、短半轴和椭圆中心,然后调用私有方法PlotPartI和PlotPartII来绘制椭圆,利用只读属性Image得到绘制后的位图,实现的核心如下:

public class TDrawEllipse

{

private Bitmap image;//存储生成椭圆的位图

public Bitmap Image

{

get

{ return this.image; //返回绘制好椭圆的位图 }

}

private int oX, oY, a, b;//存储椭圆的中心和长短半轴

private Color color;//存储椭圆的颜色

private void PlotPoints(int x, int y) //绘制坐标点

{

//由于算法是以(0,0)点为椭圆中心构造的,绘制椭圆时需要把传递的坐标

//平移到真正的椭圆中心(oX,oY)并绘制其它象限的像素点。

this.image.SetPixel(this.oX + x, this.oY + y, this.color);

this.image.SetPixel(this.oX - x, this.oY + y, this.color);

this.image.SetPixel(this.oX - x, this.oY - y, this.color);

this.image.SetPixel(this.oX + x, this.oY - y, this.color);

}

private void PlotPartI()//绘制第一部分

{

int x = 0, y = b;

int d = 2 * b * b - 2 * a * a * b + a * a;

while (b * b * x a * a * y)

{

PlotPoints(x, y);

if (d 0)

{ x = x + 1; d = d + 4 * b * b * x + 2 * b * b; }

else

{ x = x + 1; y = y - 1;

d = d + 4 * b * b * x + 2 * b * b - 4 * a * a * y; }

}

}

private void PlotPartII()//绘制第二部分

{

int y = 0, x = a;

int d = 2 * a * a - 2 * a * b * b + b * b;

while (b * b * x = a * a * y)

{

PlotPoints(x, y);

if (d 0)

{ y = y + 1;d = d + 4 * a * a * y + 2 * a * a; }

else

{ y = y + 1;x = x - 1;

d = d + 4 * a * a * y + 2 * a * a - 4 * b * b * x; }

}

}

public TDrawEllipse(Bitmap image)//构造函数,初始化绘制椭圆的位图

{

this.image = image;

}

public void Draw(Rectangle rt, Color color)//绘制椭圆的函数

{

//参数 Rectangle rt是要绘制椭圆的外接矩形

//参数 Color color是要绘制椭圆的颜色

this.oX = rt.Left + rt.Width / 2;//计算椭圆的中心坐标

this.oY = rt.Top + rt.Height / 2;

this.a = rt.Width / 2;//计算椭圆的长短半轴

this.b = rt.Height / 2;

this.color = color;

PlotPartI();//绘制第一部分

PlotPartII();//绘制第二部分

}

}

有了封装绘制椭圆功能的类之后,就可以在程序中进行实例化得到该类的一个对象,利用该对象调用Draw方法就可绘制出椭圆来,从而完成绘图系统中绘制椭圆功能的底层实现。以上代码在VS.NET2005中编译通过运行正常。

VC 用GDI函数画椭圆和矩形的问题,请高手帮忙

要绘空心的图形 请事先将空刷子选入设备

相关部分改了一下

case WM_MOUSEMOVE:

hdc=GetDC(hWnd);

SelectObject(hdc, GetStockObject(NULL_BRUSH));

SetROP2(hdc,R2_NOT);

if(bDraw==TRUE)

{

if(drawcontrol==1)//rect

{

//SetROP2(hdc,R2_XORPEN);

MoveToEx(hdc,x1,y1,NULL);

Rectangle(hdc,x1,y1,x2,y2);

x2=LOWORD(lParam);

y2=HIWORD(lParam);

MoveToEx(hdc,x1,y1,NULL);

Rectangle(hdc,x1,y1,x2,y2);

SetROP2(hdc,R2_NOT);

}

else if(drawcontrol==2)//ellipse

{

//SetROP2(hdc,R2_XORPEN);

MoveToEx(hdc,x1,y1,NULL);

Ellipse(hdc,x1,y1,x2,y2);

x2=LOWORD(lParam);

y2=HIWORD(lParam);

MoveToEx(hdc,x1,y1,NULL);

Ellipse(hdc,x1,y1,x2,y2);

}

else if(drawcontrol==3)//freeline

{

MoveToEx(hdc,x1,y1,NULL);

x1=LOWORD(lParam);

y1=HIWORD(lParam);

LineTo(hdc,x1,y1);

ReleaseDC(hWnd,hdc);

}

else if(drawcontrol==4)//line

{

MoveToEx(hdc,x1,y1,NULL);

LineTo(hdc,x2,y2);

x2=LOWORD(lParam);

y2=HIWORD(lParam);

MoveToEx(hdc,x1,y1,NULL);

LineTo(hdc,x2,y2);

}

// "if ..." end here

}

ReleaseDC(hWnd,hdc);

return 0;

用vc怎么实现画线、圆、矩形、抛物线?

这需要用到图形编程的知识,虽然在VC中没有图形编程的头函数graphics.h,但是现在有人编写了那个头函数,同时在VC中可以用MFC 来作图。

用graphics.h作图来实现上述功能代码如下(你可以到网上去找到那个头文件):

画线:line(int x1,int y1,int x2,int y2)/*其中(x1,y1)组成了直线在窗口中的起始坐标,(x2,y2)组成了另外一个坐标,即:两点确定一条直线*/

画圆:circle(int a,int b,int r)/*其中(a,b)构成了圆的圆心坐标,r为圆的半径*/

画矩形:bar(int x1,int y1,int x2,int y2)/*这个函数用于画无边框填充矩形。(x1,y1)组成了矩形左上角的坐标,(x2,y2)组成了矩形的右下角的坐标*/

void rectangle(

int left,

int top,

int right,

int bottom

);

这个函数用于画空心矩形

left

矩形左部 x 坐标。

top

矩形上部 y 坐标。

right

矩形右部 x 坐标。

bottom

矩形下部 y 坐标。

ellipse

这个函数用于画椭圆弧线。

void ellipse(

int x,

int y,

int stangle,

int endangle,

int xradius,

int yradius

);参数:

x

椭圆弧线的圆心 x 坐标。

y

椭圆弧线的圆心 y 坐标。

stangle

椭圆弧线的起始角的角度。

endangle

椭圆弧线的终止角的角度。

xradius

椭圆弧线的 x 轴半径。

yradius

椭圆弧线的 y 轴半径。

drawpoly

这个函数用于画多边形。

void drawpoly(

int numpoints,

const int *polypoints

);参数:

numpoints

多边形点的个数。

polypoints

每个点的坐标,数组元素个数为 numpoints * 2。

该函数并不会自动连接多边形首尾。如果需要画封闭的多边形,请将最后一个点设置为与第一点相同。

用vc++6.0 编程画一个椭圆出来,求完整源代码

#include windows.h

#pragma comment(linker, "/subsystem:windows")

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmd, INT nShow)

{

    HWND h = CreateWindowA("#32770", "椭圆", WS_OVERLAPPEDWINDOW | WS_VISIBLE,

        CW_USEDEFAULT, CW_USEDEFAULT, 300, 200,

        0, 0, hInst, 0);

    HWND hs = CreateWindowA("Static", "", WS_CHILD | WS_VISIBLE | SS_BITMAP,

        0, 0, 200, 100, h, 0, hInst, 0);

    HDC d = GetDC(hs);

    HBITMAP b = CreateCompatibleBitmap(d, 200, 100);

    HDC m = CreateCompatibleDC(d);

    SelectObject(m, b);

    BitBlt(m, 0, 0, 200, 100, d, 0, 0, WHITENESS);

    Ellipse(m, 0, 0, 200, 100);

    DeleteDC(m);

    ReleaseDC(hs, d);

    SendMessage(hs, STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)b);

    MSG mg;

    while( GetMessageA(mg, 0, 0, 0)  0 ) {

        if (mg.message == WM_COMMAND  mg.wParam == (WPARAM)MAKEWORD(IDCANCEL, BN_CLICKED))

            break;

        TranslateMessage(mg);

        DispatchMessageA(mg);

    }

    DeleteObject(b);

    DestroyWindow(h);

    return 0;

}

关于vc直接生成椭圆函数图像程序代码和椭圆图像是函数图像吗的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/29782.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载