㈠ 计算机图形学:直线段扫描转换算法
//数值微分算法(DDA算法)
#include<iostream>
using namespace std;
int main()
{
float x0,y0,x1,y1,x2,y2;
cin>>x1>>y1;
cin>>x0>>y0;
float k;
k=(y1-y0)/(x1-x0);
if(k<1)
{
x2=x1+1;
y2=y2+k;
}
else if(k>=1)
{
y2=y1+1;
x2=1/k+x1;
}
cout<<x2<<" "<<y2<<endl;
return 0;
}
//中点划线算法
#include<iostream>
using namespace std;
int main()
{ float x,y;
float x0,y0,x1,y1;
cin>>x0>>y0>>x1>>y1;
float a,b,c;
a=y0-y1;
b=x1-x0;
c=x0*y1-x1*y0;
float sum;
sum=a*x+b*y+c;
float Xq,Yq;
float Xm,Ym;
Xm=x0+1;
Ym=y0+0.5;
float d;
d=a*Xm+b*Ym+c;
if(d<0)
{Xq=x0+1; Yq=y0+1; }
else if(d>0)
{ Xq=x0+1; Yq=y0; }
else if(d=0)
{ Xq=x0+1; Yq=y0; }
cout<<Xq<<" "<<Yq<<endl;return 0;
}
//Bresenham算法//有一个整数数组,请求出两两之差绝对值最大的值(最小的值)
#include<iostream>
using namespace std;
int jisuan(int a,int b)
{ int des=0; des=a-b; if(des<0)
des=-des;
return des;}
int main()
{ int dec=0; int max=0; int a[5]={0,2,5,9,4}; for(int i=1;i<5;i++)
{ dec=jisuan(a[i],a[i-1]); if(max<dec) max=dec; }
cout<<max<<endl;
return 0;
}
不好意思,最后一个是我写的另一个代码,贴错了
㈡ 计算机图形学:Matlab编程画直线(DDA算法)
function DDA(x1,y1,x2,y2,color)
length =abs(x2-x1);
if abs(y2-y1)>length
length=abs(y2-y1);
end
dx=(x2-x1)/length;
dy=(y2-y1)/length;
x=x1+0.5*sign(dx);
y=y1+0.5*sign(dy);
hold on
for i=1:length
plot(round(x),round(y),'Color',color)
x=x+dx;
y=y+dy;
end
hold off
end
㈢ 求计算机图形学中的直线绘制函数法、DDA算法、中点法和Bresenham算法的优缺点以及比较.
Bresenham算法的特点是:
1,不必计巧毁首算直线之斜率,因此不做除法;
2,不用浮点数,只用整数;
3,只做整数加孝数减法和乘2运算,而乘2运算可以用硬件移位实现.
Bresenham算法速度很快,并适余悄于用硬件实现.
DDA算法的特点:
浮点数运算
不易硬件实现
中点画线法特点:
只有整数运算,不含乘除法
可用硬件实现
因(X0,Y0)在直线上,所以F(X0,Y0)=0
㈣ 求计算机图形学的中点画抛物线详细算法,已经每一步实现的功能,最好能说一下思想。谢谢!
抛物线是指平面内到一个定点F(焦点)和一条定直线l(准线)距离相等的点的轨迹。它有许多表示方法,例如参数表示,标准方程表示等等。 它在几何光学和力学中有重要的用处。 抛物线也是圆锥曲线的一种,即圆锥面与平行于某条母线的平面相截而得的曲线。二次函数的图像就是一条抛物线,它是一个轴对称图形。抛物线与对称轴的交点叫做抛物线的顶点。抛物线即把物体抛掷出去,落在远处地面,这物体在空中经过的曲线。
平面内,到定点与定直线的距离相等的点的轨迹叫做抛物线。其中定点叫抛物线的焦点,定直线叫抛物线的准线。当抛物线的顶点为原点时,抛物线有以下特征:
①原点在抛物线上;
②对称轴为坐标轴;
③准线与对称轴垂直,垂足与焦点分别对称于原点,它们与原点的距离都等于一次项系数的绝对值的1/4。
对称轴为x轴时,方程右端为±2px,方程的左端为y^2;对称轴为y轴时,方程的右端为±2py,方程的左端为x^2;开口方向与x轴(或y轴)的正半轴相同时,焦点在x轴(y轴)的正半轴上,方程的右端取正号;开口方向与x(或y轴)的负半轴相同时,焦点在x轴(或y轴)的负半轴上,方程的右端取负号。
抛物线的弦是连接抛物线上任意两点的线段。
抛物线的焦弦是经过抛物线焦点的弦。
抛物线的直径是抛物线一组平行弦中点的轨迹。这条直径也叫这组平行弦的共轭直径。
希望我能帮助你解疑释惑。
㈤ 求计算机图形学中的直线绘制函数法、DDA算法、中点法和Bresenham算法的优缺点以及比较.
DDA称为数值微分画线算法,是直线生成算法中最简单的一种.原理相当简单,就是最直观的根据斜率的偏移程度,决定是以x为步进方向还是以y为步进方向.然后在相应的步进方向上,步进变量每次增加一个像素,而另一个相关坐标变量则为Yk_1=Yk+m(以x为步进变量为例,m为斜率)假定直线斜率k在0~1之间,当前象素点为(xp,yp),则下一个象素点有两种可选择点P1(xp+1,yp)或P2(xp+1,yp+1).若P1与P2的中点(xp+1,yp+0.5)称为M,Q为理想直线与x=xp+1垂线的交点.当M在Q的下方时,则取P2应为下一个象素点;当M在Q的上方时,则取P1为下一个象素点.这就是中点画线法的基本原理Bresenham:过各行、各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线各垂直网格线的交点,然后确定该列像素中与此交点最近的像素.该算法的优点在于可以采用增量计算,使得对于每一列,只要检查一个误差项的符号,就可以确定该列所求的像素.大概就是这样,预知详细,
㈥ 用C++如何实现bresenham画线算法计算机图形学上面有个drawpixel的函数。不知道怎么用。
drawpixel()函数这就是VC画点的,不同的平台由不同的函数来画点,这个是API函数不管什么平台归结到底都是调用这个函数来画点。
COLORREF SetPixel(
HDC hdc, // handle to DC
int X, // x-coordinate of pixel
int Y, // y-coordinate of pixel
COLORREF crColor // pixel color
);