實現Bresenham提取線段上的所有點(影象柵格化)
阿新 • • 發佈:2019-02-19
主要是在原來演算法的基礎上略微修改,增加了對首尾端點的處理:
#include "opencv.hpp" // 交換整數 a 、b 的值 inline void swap_int(int*a, int *b) { *a ^= *b; *b ^= *a; *a ^= *b; } // Bresenham's line algorithm bool GetLinePts(int x1, int y1, int x2, int y2, std::vector<cv::Point>& vPts) { //引數 c 為顏色值 //增加第一個端點 cv::Point ptStart(x1, y1); cv::Point ptEnd(x2, y2); vPts.push_back(ptStart); int dx = abs(x2 - x1), dy = abs(y2 - y1), yy = 0; if (dx < dy) { yy = 1; swap_int(&x1, &y1); swap_int(&x2, &y2); swap_int(&dx, &dy); } int ix = (x2 - x1) > 0 ? 1 : -1, iy = (y2 - y1) > 0 ? 1 : -1, cx = x1, cy = y1, n2dy = dy * 2, n2dydx = (dy - dx) * 2, d = dy * 2 - dx; if (yy) { // 如果直線與 x 軸的夾角大於 45 度 while (cx != x2) { if (d < 0) { d += n2dy; } else { cy += iy; d += n2dydx; } vPts.push_back(cv::Point(cy, cx)); cx += ix; } } else { // 如果直線與 x 軸的夾角小於 45 度 while (cx != x2) { if (d < 0) { d += n2dy; } else { cy += iy; d += n2dydx; } vPts.push_back(cv::Point(cx, cy)); cx += ix; } } //需要包含首尾端點,進行處理 if (vPts.size() >= 2 && vPts[0] == vPts[1]) { vPts.erase(vPts.begin()); } if (vPts.size() && vPts[vPts.size() - 1] != ptEnd) { vPts.push_back(ptEnd); } return true; }