1、DDA(デジタル微分解析機)アルゴリズム
DDAアルゴリズムは、コンピュータグラフィックスで直線を描くための最も単純なアルゴリズムです。
線分の2つの端点P0(x0、y0)とP1(x1、y1)は既知です。
次に、直線の傾きを取得できます。
k = (y2 - y1) / (x2 - x1)
kとbの両方が計算されるという条件の下で、xの値がわかっている限り、yの値を計算できます。
y = kx + b
横軸xが毎回1ずつ増加する場合(このステップ1、つまりx = x +1と呼びます)、yのステップはk + bです。
x = x + 1
y = y + (k + b)
また、yの値がわかれば、xの値も計算できます。このとき、yのステップは1で、xのステップは(1-b)/ kです。
y = y + 1
x = x +(1 - b) / k
計算されたx値とy値に従って、切り捨てて座標(x '、y')を取得し、直線セグメント上の(x '、y')に点を描画します。
計算をさらに単純化するために、通常、bを0に設定し、開始点を(0,0)と見なすことができます。
現在の点の座標が(x i、y i)であり、次のピクセル点の座標が(x i + 1、y i + 1)である
とすると、DDAアルゴリズムを使用して(xiの計算式を解きます。 + 1、yi + 1)。次のように要約されます。
x i + 1 = x i + xStep(1)
y i + 1 = y i + yStep(2)
通常、xStepとyStepは、ΔxとΔyを計算することによって決定されます。
Δx>Δyの場合、x軸の最大差がy軸の最大差よりも大きく、x軸方向がステップの主方向であることを意味します。
xStep = 1、yStep = k;
Δy>Δxの場合、y軸の最大差がx軸の最大差よりも大きく、y軸方向がステップの主方向であることを意味します。
yStep = 1、xStep = 1 / k。
この式によれば、(x i、y i)を繰り返し計算して(x i + 1、y i + 1)、計算した(x、y)座標点を座標系に描くことができます。
実装ツール:
1)VS2019(C ++)
新しいプロジェクト:
2)プラグインのダウンロード:Easyx。使用法とダウンロードについては、公式Webサイトを参照してください:https: //www.easyx.cn/
クリックしてダウンロードしてからインストールクリックし
てVC2019にインストール
ソースコードは次のとおりです。
#include <iostream>
#include <graphics.h>
#include <math.h>
#include <conio.h>
using namespace std;
void DDALine(int x1, int y1, int x2, int y2)
{
int x0 = 400;
int y0 = 300; //记录原点坐标
int steps; //记录步长
int dx, dy; //记录起点和终点的坐标差值
float x, y; //记录即时坐标
float delta_x, delta_y; //记录划线过程中的坐标增量
dx = x2 - x1;
dy = y2 - y1;
if (abs(dx) > abs(dy)) //比较横纵坐标增量的大小
steps = dx;
else
steps = dy; //确保每次的增量不超过一个单位长度
x = x1;
y = y1; //记录画线起点
delta_x = float(dx) / steps;
delta_y = float(dy) / steps; //计算相邻两个点的增量
putpixel(x, y, RED);
for (int i = 0; i < steps; i++)
{
x = x + delta_x;
y = y + delta_y;
putpixel(x +int( x0 + 0.5), y0 - int(y + 0.5), RED);
}
}
int main()
{
int x1, x2, y1, y2;
int x0 = 400, y0 = 300; //坐标轴中心(x0,y0)
cout << "请输入两个整数点的坐标(x1,y1),(x2,y2)" << endl;
cin >> x1 >> y1 >> x2 >> y2;
initgraph(x0 * 2, y0 * 2); //初始化图形窗口大小
line(0, y0, x0 * 2, y0); //坐标轴X
line(x0, 0, x0, y0 * 2); //坐标轴Y
DDALine(x1, y1, x2, y2); //DDA画线算法
_getch(); //等待一个任意输入结束
closegraph(); //关闭图形窗口
return 0;
}