我創建了一個函數,該函數接受矢量中的2個點的2D std::vector
,並在矢量內「繪製」一條線。但是,它並不涵蓋所有情況(八分圓)。一條線我的意思是直線相互連接的點。該矢量將被寫入.ppm
文件,因此它在圖像中顯示爲一條線。Bresenham的線算法所有情況下
我實現了使用這個鏈接此功能:https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm
看這裏:https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm#All_cases
我試圖弄清楚如何改變我的功能,因此它「繪製」一條線在2D矢量任何2個座標,但我有點困惑。我不明白爲什麼有一個函數應用於輸入和輸出。以及哪一個適用於哪個座標。另外,我不知道如何找出哪個八分圓線從2個座標是
二維向量將被寫入.ppm
文件是這樣的:
255 255 255 255 255 255 255 255 255
255 255 255 0 0 0 255 255 255
255 255 255 255 255 255 255 255 255
此圖片是中心有一個黑點。
#include <vector>
#include <tuple>
#include <utility>
using pixel = std::tuple<unsigned, unsigned, unsigned>; // rgb pixel
using row_t = std::vector<pixel>; // row in a 2D vector
using grid_t = std::vector<row_t>; // the grid made up of rows
// x, y coordinate - access is like grid[y][x] since grid is made of rows
using coord = std::pair<long long, long long>;
// Bresenham's line algorithm
// 2 points to draw a line between
void draw(grid_t& grid, const coord& c1, const coord& c2)
{
long long dx{c2.first - c1.first},
dy{c2.second - c1.second},
D {2 * dy - dx},
y {c1.second};
// is the if/else needed?
if (c1.first <= c2.first)
for (long long x{c1.first}; x <= c2.first; ++x)
{
grid[y][x] = pixel{0, 0, 0};
if (D > 0)
{
++y;
D -= 2 * dx;
}
D += 2 * dy;
}
else
for (long long x{c1.first}; x >= c2.first; --x)
{
grid[y][x] = pixel{0, 0, 0};
if (D > 0)
{
++y;
D -= 2 * dx;
}
D += 2 * dy;
}
}
使這一功能工作,對所有的情況下(以及如何使它更好),並幫助我瞭解如何將不勝感激任何幫助。
「在矢量中畫線」的含義是什麼? – user463035818
@ tobi303他有一個向量矢量(換句話說是一個二維數組),這個二維數組的每個元素表示一個像素。 –
@ tobi303在一條直線上連接的一系列點儘可能直線。我將編輯該問題。 – cppxor2arr