導航:首頁 > 源碼編譯 > ellipse函數源碼

ellipse函數源碼

發布時間:2022-04-22 10:55:12

㈠ MFC編程ellipse()怎麼畫圓

所謂的動態畫線,畫矩形,畫橢圓的本質就是在於消隱問題的解決以及對Windows消息循環機制的理解,消隱問題:因為MFC中有一個函數SetROP2,通過將該函數的參數設置為R2—NOT(當前繪制的像素值設為屏幕像素值的反色,這裡面的「屏幕」二字是指你所繪制的圖形所佔據的那一部分屏幕區域,即直線所佔的屏幕區域就是直線所在的那一段線的區域),利用這一點通過在同一區域重復畫兩次便可以將該區域的形狀消隱。

而Windows消息循環機制更好的體現於MouseMove消息響應中,因為要實現動態畫線、畫矩形這就體現在滑鼠在繪圖區的移動上,滑鼠在繪圖區移動時,產生動態的效果,也就是說在mouse 移動的過程中始終在畫線、畫矩形,這就要求在MouseMove消息響應中有畫線、畫矩形的相應函數的調用,但正是因為mouse移動的過程中畫了很多的線、矩形,所以我們就要在mouse移動的過程中將之前畫出的線、矩形消隱掉,才能保證實現了自己所要實現的功能——動態畫線、畫矩形,但又沒有產生多餘的線和矩形。
消隱的問題和動態畫圖的問題關鍵在於MouseMove消息響應中的函數調用的順序:
1.首先將上次所畫的圖形消隱掉
2.畫出臨時的圖形
3.消息循環的機制:循環執行上述代碼(這是Windows循環的機制,不需要自己代碼實現)

在最後的LButtonUp消息響應中,需要將上面的MouseMove消息響應中循環的最後一次中最後所畫的臨時圖形消隱掉,之後根據LButtonUp消息響應中point參數畫出最終的圖形。綜上可知:MouseMove中的代碼和LButtonUp中消隱臨時圖形的代碼所要實現的功能就是動態這一過程,而圖形的最終繪制還在與LButtonUp消息響應及其point參數。
代碼如下:
[cpp] view plain
private:
[cpp] view plain
//......
HCURSOR m_HCross;
UINT m_drawType;
CPoint m_OldPoint;
CPoint m_startPoint;
BOOL m_startRect;
[cpp] view plain
CGISView::CGISView()
{
// TODO: add construction code here
//....
m_startRect=FALSE;
m_startPoint=0;
m_OldPoint=0;
m_drawType=0;
//初始化m_HCross為十字游標
m_HCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS);

}
[cpp] view plain
void CGISView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_startRect=TRUE; //滑鼠左鍵單擊,設置可以開始繪制矩形框
m_startPoint=point; //記錄起始點
m_OldPoint=point;//設置老點也為起始點
//設置游標為十字游標
::SetCursor(m_HCross);

CView::OnLButtonDown(nFlags, point);
}
[cpp] view plain
void CGISView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

CClientDC dc(this); //獲取設備句柄
dc.SetROP2(R2_NOT);//此為關鍵
dc.SetROP2(R2_NOT);//所繪制的圖形並沒有消失,所以可以驗證下面的連續兩次顏色取反不是在一次相應中完成
//SetRop2 Specifies the new drawing mode.(MSDN)
//R2_NOT Pixel is the inverse of the screen color.(MSDN)
//即:該函數用來定義繪制的顏色,而該參數則將顏色設置為原屏幕顏色的反色
//這樣,如果連續繪制兩次的話,就可以恢復原來屏幕的顏色了(如下)
//但是,這里的連續兩次繪制卻不是在一次消息響應中完成的
//而是在第一次拖動響應的繪制可以顯示(也就是看到的),第二次拖動繪制實現擦出(也就看不到了)

dc.SelectStockObject(NULL_BRUSH);//不使用畫刷
if(TRUE==m_startRect) //根據是否有單擊判斷是否可以畫矩形
{
switch(m_drawType)
{
case 1://Rectangle

::SetCursor(m_HCross);
dc.Rectangle(CRect(m_startPoint,m_OldPoint));
dc.Rectangle(CRect(m_startPoint,point));
m_OldPoint=point;

break;

case 2: //Line
::SetCursor(m_HCross);
//擦去上一次繪制的臨時線
dc.MoveTo(m_startPoint);
dc.LineTo(m_OldPoint);

//繪制這一次的臨時線
dc.MoveTo(m_startPoint);
dc.LineTo(point);

//將臨時線的終點復制給m_OldPoint,
//使其在消息循環的過程中將該值傳遞到
//擦去上一次畫線的過程中,以便擦去上一次所畫的線
m_OldPoint=point;

break;
case 3: //Circle
::SetCursor(m_HCross);
//擦去上一次繪制的臨時圓
//設定該圓的y坐標,因為要保證兩點的x之差等於y之差
m_OldPoint.y=m_OldPoint.x-m_startPoint.x+m_startPoint.y;
dc.Ellipse(CRect(m_startPoint,m_OldPoint));

//繪制臨時圓

point.y=point.x-m_startPoint.x+m_startPoint.y;
dc.Ellipse(CRect(m_startPoint,point));

m_OldPoint=point;
break;
case 4: //Ellipse
::SetCursor(m_HCross);

dc.Ellipse(CRect(m_startPoint,m_OldPoint));
dc.Ellipse(CRect(m_startPoint,point));
m_OldPoint=point;
break;
case 5: //Dot

break;

}
[cpp] view plain
}
[cpp] view plain
}
[cpp] view plain
void CGISView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_startRect=FALSE;//重置繪制矩形框標志
::ClipCursor(NULL);//解鎖游標,即將游標恢復為默認游標
//消隱最後的一個矩形
CClientDC dc(this);//獲取設備句柄
// dc.SetROP2(R2_NOT); //在MouseMove消息響應中使用過該函數了,所以在這里再一次使用會使得其恢復為屏幕的顏色
dc.SelectStockObject(NULL_BRUSH); //設置畫刷為空畫刷
switch(m_drawType)
{
case 1: //Retangle

//利用當前畫刷繪制矩形,內部由當前空畫刷(NULL_BRUSH)填充。
//擦去MouseMove消息響應中的臨時矩形
dc.Rectangle(CRect(m_startPoint,m_OldPoint));
//繪制固定矩形
dc.Rectangle(CRect(m_startPoint,point));

//m_drawType=0; //該行的可以使得每畫一次都要選擇所畫的形狀
break;

case 2: //Line

//擦去MouseMove消息響應中繪制的最後一次臨時線
dc.MoveTo(m_startPoint);
dc.LineTo(m_OldPoint);

//繪制固定線
dc.MoveTo(m_startPoint);
dc.LineTo(point);
break;
case 3: //Circle

dc.Ellipse(CRect(m_startPoint,m_OldPoint));
dc.Ellipse(CRect(m_startPoint,point));
break;
case 4: //Ellipse

dc.Ellipse(CRect(m_startPoint,m_OldPoint));
dc.Ellipse(CRect(m_startPoint,point));
break;
case 5: //Dot
dc.SetPixel(point,RGB(0,0,0));
break;

}
CView::OnLButtonUp(nFlags, point);
}
[cpp] view plain
void CGISView::OnRectangle()
{
// TODO: Add your command handler code here
m_drawType=1;//設置所畫的為矩形

}

void CGISView::OnLine()
{
// TODO: Add your command handler code here
m_drawType=2;
}

void CGISView::OnEllipse()
{
// TODO: Add your command handler code here
m_drawType=4;
}

void CGISView::OnDot()
{
// TODO: Add your command handler code here
m_drawType=5;

}

void CGISView::OnCircle()
{
// TODO: Add your command handler code here
m_drawType=3;
}

以上為自己根據實際編程練習和對博文的學習所領悟到的,如果有哪裡理解的不對,還望大家指正,謝謝哈!(代碼沒有問題,可以正常運行。)
註:代碼的排版,我多次修改,並確保整齊,但是一旦我發表後,代碼的排版就會發生改變,有幾行代碼就會變得不規則。

㈡ 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中編譯通過運行正常。

㈢ ellipse(250,250,0,360,top,bottom); 有哪位大神能幫我分析下,ellipse()函數裡面的六個數字分別代表的含

ellipse 函數並不是 c 語言標准庫裡面的,所以,不同的公司對這個函數的規定不一樣。

borland 公司對這個函數的規定如下:
ellipse(圓心x,圓心y,起始角,終止角,x半徑,y半徑);

微軟對這個函數的規定如下:
Ellipse(DC句柄,left,top,right,bottom); // 註:left, top, right, bottom 是橢圓外切矩形的坐標

EasyX 庫對這個函數的規定如下:
ellipse(left, top, right, bottom); // 註:left, top, right, bottom 是橢圓外切矩形的坐標

初學 vc6 繪圖常用的庫一般是 easyx,所以你可以使用 4 個參數試試。如果和你想要的結果不一樣,簡單的做一下參數轉換就行。比如,將你的代碼由 borland 公司的參數用在 easyx 上可以這么寫:
ellipse(250 - top, 250 - bottom, 250 + top, 250 + botom);

㈣ vc++如何用pDC->Ellipse()畫橢圓的一部分

圓弧不要用Ellipse畫,用Arc函數畫

pDC->Arc(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);

由(x1, y1, x2, y2)確定橢圓外接矩形,(x3, y3, x4, y4)確定圓弧起點與終點(不一定在所要圓弧上,但必須使其與圓心的連線與前確定的橢圓有交點)

㈤ C中畫橢圓的工具一般最多五個參數,而下面的函數中卻有六個,請幫忘解釋下每個參數的含義:ellipse(250,25

ellipse(250,250,0,360,top,bottom);
參數從左往右分別是:
圓心x坐標,圓心y坐標,起始角度,終止角度,x軸半徑,y軸半徑

㈥ VC中畫線,moveto,lineto;畫圓:.ellipse,具體說明函數原理.

MoveTo( int x, int y );
Moves the current position to the point specified by x and y
(or by point).
畫線段的起點
LineTo( int x, int y );
Draws a line from the current position up to, but not including, the point
specified by x and y (or point). The line is drawn with the
selected pen. The current position is set to x,y or to
point.
畫線段的終點

BOOL Ellipse( int x1, int y1,
int x2, int y2 );
Draws an ellipse. The center of the ellipse is the center of the bounding
rectangle specified by x1, y1, x2, and y2, or
lpRect. The ellipse is drawn with the current pen, and its interior is
filled with the current brush.
根據兩個點畫橢圓

㈦ MFC中 ellipse 函數代碼在哪裡查看

看不到,MFC不是開源的.

㈧ Ellipse函數的4個參數分別是什麼意思

Declare Function Ellipse Lib "gdi32" Alias "Ellipse" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
描繪一個橢圓,由指定的矩形圍繞。橢圓用當前選擇的畫筆描繪,並用當前選擇的刷子填充

hdc Long,設備場景的句柄
X1,Y1 Long,約束矩形採用邏輯坐標的左上角位置
X2,Y2 Long,約束矩形採用邏輯坐標的右下角位置

㈨ 編java代碼求橢圓和長方形的面積和周長。

沒明白isLargeThan是什麼意思,能說得詳細點兒么?
先把滿足前四個條件的程序發給你,你看看行不行。
註:一個類一個java文件,運行Test3類執行。

public class Point {
private double x;
private double y;
public Point() {
x=0;
y=0;
}
public Point(double x,double y){
this.x=x;
this.y=y;
}
public double getX(){
return this.x;
}
public double getY(){
return this.y;
}
public void setX(double x){
this.x=x;
}
public void setY(double y){
this.y=y;
}
public Point translate(double u,double v){
this.x=this.x+u;
this.y=this.y+v;
return new Point (this.x,this.y);
}
}
public class Rectangle extends Point {
private double height;
private double wideth;
public Rectangle() {
super();
}
public Rectangle(Point p,double h,double w){
super(p.getX(),p.getY());
this.height=h;
this.wideth=w;
}
public double getPerimeter(){
return 2*(height+wideth);
}
public double getArea(){
return height*wideth;
}
}
public class Ellipse extends Point{

private double height;
private double wideth;
public Ellipse() {
super();
}
public Ellipse(Point p,double h,double w){
super(p.getX(),p.getY());
this.height=h;
this.wideth=w;
}
public double getPerimeter(){
return 2*3.14*Math.sqrt((height*height+wideth*wideth)/2);

}
public double getArea(){
return 3.14*height*wideth;
}
}
public class Test3 {

public static void main(String[] args) {
Point p=new Point(1.2,4.6);
Rectangle r=new Rectangle(p,9.2,8.7);
Ellipse e=new Ellipse(p,3.2,9.2);
Point p1=p.translate(2.8,2.9);

System.out.println("移動後的點為x="+p1.getX()+" y="+p1.getY());

System.out.println("長方形的周長為:"+r.getPerimeter());
System.out.println("長方形的面積為:"+r.getArea());
System.out.println("橢圓形的周長為:"+e.getPerimeter());
System.out.println("橢圓形的面積為:"+e.getArea());
}

}

㈩ Ellipse()這個函數是用來干嗎的

函數功能:該函數用於畫一個橢圓,橢圓的中心是限定矩形的中心,使用當前畫筆畫橢圓,用當前的畫刷填充橢圓。

函數原型:BOOL Ellipse(HDC hdc, int nLeftRect, int nTopRect, nRightRect, int nBottomRect);

參數:

hdc:設備環境句柄。

nLeftRect:指定限定矩形左上角的X坐標。

nTopRect:指定限定矩形左上角的Y坐標。

nRightRect:指定限定矩形右下角的X坐標。

nBottomRect:指定限定矩形右下角的Y坐標。

返回值:如果函數調用成功,返回值非零;如果函數調用失敗,返回值是0。

Windows NT:若想獲得更多錯誤信息,請調用GetLastError函數。

備註:橢圓既不使用也不改變當前位置。

Windows 95和Windows 98:限定矩形的坐標值之和不能超過32767。nLeftRect與nRigthRect或nTopRectn與BottomRect之和不能超過32767。

速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;頭文件:wingdi.h;庫文件:gdi32.lib。

閱讀全文

與ellipse函數源碼相關的資料

熱點內容
怎麼提前看未播出的電視劇app 瀏覽:664
cad轉pdf圖層 瀏覽:598
程序員接私活初級 瀏覽:431
全無油潤滑壓縮機 瀏覽:183
代碼加密常用方法 瀏覽:952
安卓手機如何解除已禁用 瀏覽:396
演算法的隨機性 瀏覽:485
高中解壓體育游戲 瀏覽:533
androidstudior丟失 瀏覽:345
命令行筆記 瀏覽:738
360目標文件夾訪問拒絕 瀏覽:519
3b編程加工指令 瀏覽:789
c8051f系列單片機選型手冊 瀏覽:773
南昌php程序員 瀏覽:512
bcs命令 瀏覽:446
如何在伺服器指向域名 瀏覽:417
車床編程可以做刀嗎 瀏覽:519
ln命令源碼 瀏覽:792
用粘液做解壓手套 瀏覽:331
icloud收信伺服器地址 瀏覽:500