導航:首頁 > 源碼編譯 > 直線演算法

直線演算法

發布時間:2022-01-13 16:31:32

㈠ 回歸直線演算法

y等於x份之k才對吧!

㈡ 角度轉直線演算法

直線傾斜的角度在解析幾何中稱為斜率,為直線與X軸所成角度α的正切值用k表示,即tanα=k
已知a(x1,y1) b(x2,y2),則k=(y1-y2)/(x1-x2)
∵a(x=10,y=10) b(x=100,y=100)
∴k=(100-10)/(100-10)=1
∴直線傾斜的角度是45º

㈢ 已知兩點的坐標,求直線的演算法

易知 方程斜率為k=(x1-x2)/(y1-y2) 又直線過(x1,y1) 則直線方程是y-y1=(x1-x2)/(y1-y2)(x-x1) 然後在整理下就可以了

㈣ 擬合直線演算法

你沒有給數據啊。

輸入x和y,然後選擇上交所擬合類型1線性2二次
然後方誤差由下式給出

㈤ Bresenham直線演演算法的一般化

雖然以上的演算法只能繪畫由右上至左下,且斜率小於或等於1的直線,但我們可以擴展此演算法,使之可繪畫任何的直線。第一個擴展是繪畫反方向,即由左下至右上的直線。這可以簡單地透過在x0 > x1時交換起點和終點來做到。第二個擴展是繪畫斜率為負的直線。可以檢查y0 ≥ y1是否成立;若該不等式成立,誤差超出0.5時y的值改為加-1。最後,我們還需要擴展該演算法,使之可以繪畫斜率絕對值大於1的直線。要做到這點,我們可以利用大斜率直線對直線y=x的反射是一條小斜率直線的事實,在整個計算過程中交換 x 和 y,並一並將plot的參數順序交換。擴展後的偽代碼如下:
function line(x0, x1, y0, y1)
boolean steep := abs(y1 - y0) > abs(x1 - x0)
if steep then
swap(x0, y0)
swap(x1, y1)
if x0 > x1 then
swap(x0, x1)
swap(y0, y1)
int deltax := x1 - x0
int deltay := abs(y1 - y0)
real error := 0
real deltaerr := deltay / deltax
int ystep
int y := y0
if y0 < y1 then ystep := 1 else ystep := -1
for x from x0 to x1
if steep then plot(y,x) else plot(x,y)
error := error + deltaerr
if error ≥ 0.5 then
y := y + ystep
error := error - 1.0
以上的程序可以處理任何的直線,實現了完整的Bresenham直線演算法。

㈥ 利用C語言編寫 能夠畫出任意的直線演算法程序(利用畫點函數)

上次剛寫過,在VC下運行的,
int dx,dy,incrE,incrNE,d,x,y;

if ((point[1].x-point[0].x)==0){ //垂直的直線
x=point[0].x;
for(y=point[0].y;y<point[1].y;y++)
pDC->SetPixel(x,y,50);
}
else if(abs((point[1].y-point[0].y)/(point[1].x-point[0].x))<=1){ //斜率 -1到 1 之間
dx=point[1].x-point[0].x;
dy=point[0].y-point[1].y;
d=dx-2*dy;

incrE=-2*dy;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC->SetPixel(x,y,50);
if(point[0].y>point[1].y){
while(x<point[1].x)
{
if(d>=0){
d+=incrE;
x++;
}
else
{d+=incrNE;
x++;
y--;
}
pDC->SetPixel(x,y,50);
}
}
else if(point[0].y<=point[1].y){
dy=point[1].y-point[0].y;
incrE=-2*dy;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC->SetPixel(x,y,50);
while(x<point[1].x)
{
if(d>=0){
d+=incrE;
x++;
}
else
{d+=incrNE;
x++;
y++;
}
pDC->SetPixel(x,y,50);
}
}
}
else { //斜率 <-1 和 >1的直線
if(point[1].x>=point[0].x){
dx=point[1].x-point[0].x;
dy=point[1].y-point[0].y;
d=2*dx-dy;
incrE=2*dx;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC->SetPixel(x,y,50);
while(x<point[1].x)
{
if(d<0){
d+=incrE;

y++;

}
else
{d+=incrNE;
pDC->SetPixel(x,y,50);
x++;
y++;
}
pDC->SetPixel(x,y,50);
}
}
else if((point[1].y-point[0].y)/(point[1].x-point[0].x)<-1){
dx=point[1].x-point[0].x;
dy=point[0].y-point[1].y;
d=2*dx-dy;
incrE=2*dx;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC->SetPixel(x,y,50);
while(y<point[1].y)
{
if(d>0){
d+=incrE;
y++;

}
else
{d+=incrNE;
x--;
y++;
}
pDC->SetPixel(x,y,50);
}

}

}

㈦ Bresenham直線演演算法的介紹

Bresenham直線演算法是用來描繪由兩點所決定的直線的演算法,它會算出一條線段在 n 維光柵上最接近的點。這個演算法只會用到較為快速的整數加法、減法和位元移位,常用於繪制電腦畫面中的直線。是計算機圖形學中最先發展出來的演算法。

㈧ 求反走樣直線演算法

請看這個。。在MFC建立EXE即可void Mbline();
void AntDisline();double m_x0,m_y0,m_x1,m_y1;#include"InputDlg.h"
#define ROUND(a) int(a+0.5)void CTestView::Mbline()//走樣函數直線
{
CClientDC dc(this);
COLORREF rgb=RGB(0,0,0);
x=m_x0;y=m_y0;k=(m_y1-m_y0)/(m_x1-m_x0);
d=0.5-k;
for(x=x0;x<=x1;x++)
{
if(d<0)
{
y++;
d+=1-k;
}
else
d-+k;
}
dc.TestOut(10,10,"走樣直線");
}
void CTestView::AntiDisline()//距離加權反走樣直線
{
CClientDC dc(this);
double x,y,d,k;
k=(y1-y0)/(x1-x0);
d=0;x=x0+10;y=y0+10;
COLORREF rgb1=RGB(0,0,0),rgb2=RGB(0,0,0);
for(x=x0;x<=(x1+10);x++)
{
rgb1=RGB(d*255,d*255,d*255);
rgb2=RGB((1-d)*255,(1-d)*255,(1-d)*255);
dc.SetPixel(ROUND(X),ROUND(Y+1),rgb2);
d+=k;
if(d>1.0)
{
y++;
d--;
}
}
dc.TestOut(10,100,"反走樣直線");
}
void CTestView::OnMENUAntiliasing()
{
InputDlg dlg;
if(dlg.DoModal()==IDOK)

{
x0=dig.m_x0;
y0=dig.m_y0;
x1=dig.m_x1;
y1=dig.m_y1;
}
AfxGetMainWnd()->SetWindowTest("反走樣:直線距離權反走樣演算法");
RedrawWindow();
Mbline();
AntiDisline();
}

㈨ 直線和圓的生成演算法

看不懂

㈩ 計算機圖形學直線生成演算法

我連畫圓的一塊給你吧
需要橡皮筋
橢圓
樹什麼的可以和我說
我是用
c#寫的
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Text;
using
System.Windows.Forms;
namespace
line
{
public
partial
class
Form1
:
Form
{
Graphics
g;
public
Form1()
{
InitializeComponent();
g
=
pictureBox1.CreateGraphics();
}
private
void
button1_Click_1(object
sender,
EventArgs
e)
{
//
g.TranslateTransform(-300,-300);
g.Clear(BackColor);
double
x1,
x2,
y1,
y2;
double
x,
y;
x1
=
System.Convert.ToSingle(textBox1.Text);
y1
=
System.Convert.ToSingle(textBox2.Text);
x2
=
System.Convert.ToSingle(textBox3.Text);
y2
=
System.Convert.ToSingle(textBox4.Text);
x
=
x1;
double
k
=
(y1
-
y2)
/
(x1
-
x2);
Color
color1
=
Color.FromArgb(255,
0,
0);
//定義顏色
Brush
bru1
=
new
SolidBrush(color1);//定義筆
Color
color2
=
Color.FromArgb(0,
255,
0);
//定義顏色
Brush
bru2
=
new
SolidBrush(color2);//定義筆
Pen
pen1
=
new
Pen(bru1,
1);
Pen
pen2
=
new
Pen(bru2,
1);
while
(x
<
x2)
{
//
textBox3.Text
=
System.Convert.ToString(k);
y
=
(double)k
*
(x
-
x1)
+
y1;
double
a;
a=y%1;
float
xx
=
Convert.ToSingle(x);
float
yy
=
Convert.ToSingle(y);
if
(a
>
0.5)
{
g.DrawLine(pen1,
xx,
yy,
xx,yy+1);
}
else
{
g.DrawLine(pen2,
xx,
yy,
xx,
yy+1);
}
x++;
}
//g.DrawLine(p,10,10,100,100);
}
private
void
button2_Click(object
sender,
EventArgs
e)
{
g.TranslateTransform(300,
300);
g.Clear(BackColor);
float
r;//r為圓的圓心
r
=System.Convert.ToSingle(textBox6.Text);
Color
color1
=
Color.FromArgb(255,
0,
0);
//定義顏色
Brush
bru1
=
new
SolidBrush(color1);//定義筆
Color
color2
=
Color.FromArgb(0,
255,
0);
//定義顏色
Brush
bru2
=
new
SolidBrush(color2);//定義筆
Pen
pen1
=
new
Pen(bru1,1);
Pen
pen2
=
new
Pen(bru2,
1);
float
x
=
0;
float
y
=
r;
while
(x
<r+3)
{
y
=
(float)System.Math.Sqrt(r
*
r
-
x
*
x);
float
a;
a
=
y
%
1;
y
=
y
-
a;
if
(a
>
0.5)
{
g.DrawLine(pen1,
x,
y,
x,
y+1);
g.DrawLine(pen1,
-x,
y,
-x,
y
+
1);
g.DrawLine(pen1,
x,
-y,
x,
-y
+
1);
g.DrawLine(pen1,
-x,
-y,
-x,
-y
+
1);
}
else
{
g.DrawLine(pen2,
x,
y,
x,
y+1);
g.DrawLine(pen2,
-x,
y,
-x,
y
+
1);
g.DrawLine(pen2,
x,-
y,
x,-
y
+
1);
g.DrawLine(pen2,
-x,
-y,-
x,
-y
+
1);
}
x++;
}
g.TranslateTransform(-300,
-300);
}
private
void
button3_Click(object
sender,
EventArgs
e)
{
}
private
void
comboBox1_SelectedIndexChanged(object
sender,
EventArgs
e)
{
switch
(comboBox1.Text)
{
case
"畫圓":
{
textBox1.Visible
=
false;
textBox2.Visible
=
false;
textBox3.Visible
=
false;
textBox4.Visible
=
false;
textBox5.Visible
=
true;
textBox6.Visible
=
true;
textBox7.Visible
=
false;
textBox8.Visible
=
false;
label1.Visible
=
false;
label2.Visible
=
false;
label3.Visible
=
false;
label4.Visible
=
false;
label5.Visible
=
true;
label6.Visible
=
true;
label7.Visible
=
false;
label8.Visible
=
false;
label9.Visible
=
true;
button1.Visible
=
false;
button2.Visible
=
true;
button3.Visible
=
false;
break;
}
case"畫線":
{
textBox1.Visible
=
true;
textBox2.Visible
=
true;
textBox3.Visible
=
true;
textBox4.Visible
=
true;
textBox5.Visible
=
false;
textBox6.Visible
=
false;
textBox7.Visible
=
false;
textBox8.Visible
=
false;
label1.Visible
=
true;
label2.Visible
=
true;
label3.Visible
=
true;
label4.Visible
=
true;
label5.Visible
=
false;
label6.Visible
=
false;
label7.Visible
=
false;
label8.Visible
=
false;
label9.Visible
=
false;
button1.Visible
=
true;
button2.Visible
=
false;
button3.Visible
=
false;
break;
}
case"畫橢圓":
{
textBox1.Visible
=
false;
textBox2.Visible
=
false;
textBox3.Visible
=
false;
textBox4.Visible
=
false;
textBox5.Visible
=
false;
textBox6.Visible
=
false;
textBox7.Visible
=
true;
textBox8.Visible
=
true;
label1.Visible
=
false;
label2.Visible
=
false;
label3.Visible
=
false;
label4.Visible
=
false;
label5.Visible
=
false;
label6.Visible
=
false;
label7.Visible
=
true;
label8.Visible
=
true;
label9.Visible
=
false;
button1.Visible
=
false;
button2.Visible
=
false;
button3.Visible
=
true;
break;
}
}
}
}
}

閱讀全文

與直線演算法相關的資料

熱點內容
安卓底部三鍵怎麼關閉 瀏覽:644
php高效分頁 瀏覽:11
輕閱讀的伺服器的地址是什麼 瀏覽:957
得力app如何刪除設備 瀏覽:603
怎麼把伺服器卡死 瀏覽:479
ug加密的key文件 瀏覽:165
編程理論基礎 瀏覽:311
安卓boot配置文件都有什麼 瀏覽:534
數量關系排序演算法 瀏覽:184
serv文件怎麼傳到伺服器上 瀏覽:274
開發者聯名貢獻源碼 瀏覽:338
sae部署java 瀏覽:18
校園330app怎麼下載 瀏覽:23
javahashcode演算法 瀏覽:714
pdf轉doc手機軟體 瀏覽:531
方舟手游開伺服器機床怎麼選 瀏覽:255
qt編程入門pdf下載 瀏覽:784
java編程的三個步驟 瀏覽:776
s點b點主圖源碼 瀏覽:436
電腦可以刪除的臨時文件夾 瀏覽:9