📄 geometry.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// Filename : Geometry.cpp// Written by : excel96// Description : //////////////////////////////////////////////////////////////////////////////#include "Geometry.h"#include <stdlib.h>uint getPointsFromLine(int x1, int y1, int x2, int y2, list<POINT>& rList){// Draw line in surface double xStep, yStep, X, Y; int xLength, yLength, xCount, yCount, tmp; xLength = abs(x2 - x1); yLength = abs(y2 - y1); if (xLength == 0) { return getPointsFromVLine(y1, y2, x1, rList); } else if (yLength == 0) { return getPointsFromHLine(x1, x2, y1, rList); } else if (xLength > yLength) { if(x1 > x2) { SWAP(x1, x2, tmp); SWAP(y1, y2, tmp); } yStep = (double)(y2 - y1) / (double)(x2 - x1); Y = y1; for (xCount = x1; xCount <= x2; xCount++) { // 付瘤阜 痢捞扼搁 扁匡扁甫 公矫窍绊, // 碍力肺 付瘤阜 谅钎甫 笼绢持绰促. if (xCount == x2) { rList.push_front(POINT(x2, y2)); } else { rList.push_front( POINT(xCount, (int)Y) ); Y += yStep; } } } else { if (y1 > y2) { SWAP(x1, x2, tmp); SWAP(y1, y2, tmp); } xStep = (double)(x2 - x1) / (double)(y2 - y1); X = x1; for (yCount = y1; yCount <= y2; yCount++) { if (yCount == y2) { rList.push_back(POINT(x2, y2)); } else { rList.push_front( POINT((int)X, yCount) ); X += xStep; } } } return rList.size();}uint getPointsFromVLine(int y1, int y2, int X, list<POINT>& rList){ int temp; if (y1 > y2) SWAP(y1, y2, temp); for (int i=y1; i <= y2; i++) rList.push_front(POINT(X, i)); return rList.size();}uint getPointsFromHLine(int x1, int x2, int Y, list<POINT>& rList){ int temp; if (x1 > x2) SWAP(x1, x2, temp); for(int i = x1; i <= x2; i++) rList.push_front(POINT(i, Y)); return rList.size();}uint getPointsFromLineEx(int x1, int y1, int x2, int y2, int range, list<POINT>& rList){ int xLength, yLength, nx2, ny2; xLength = abs(x2 - x1); yLength = abs(y2 - y1); if (xLength == 0) { return getPointsFromVLineEx(y1, y2, x1, range, rList); } else if (yLength == 0) { return getPointsFromHLineEx(x1, x2, y1, range, rList); } else if (xLength > yLength) { //cout << "xLength:" << xLength << endl; // 泅犁狼 X 辨捞啊 荤沥芭府焊促 辨促搁 弊成 急阑 弊绢辑 府畔茄促. if (xLength >= range) return getPointsFromLine(x1, y1, x2, y2, rList); // 葛磊鄂 辨捞甫 备茄促. int xoffset = range - xLength; //cout << "xOffset:" << xoffset << endl; if (x1 < x2) nx2 = x2 + xoffset; else nx2 = x2 - xoffset; //cout << "nx2:" << nx2 << endl; double yoffset = (double)(y2 - y1) / (double)(x2 - x1) * (double)xoffset; //cout << "yOffset:" << yoffset << endl; if (y1 < y2) ny2 = y2 + abs((int)yoffset); else ny2 = y2 - abs((int)yoffset); //ny2 = y2 - (int)yoffset; //cout << "ny2:" << ny2 << endl; getPointsFromLine(x1, y1, nx2, ny2, rList); } else { //cout << "yLength:" << yLength << endl; // 泅犁狼 Y 辨捞啊 荤沥芭府焊促 辨促搁 弊成 急阑 弊绢辑 府畔茄促. if (yLength >= range) return getPointsFromLine(x1, y1, x2, y2, rList); // 葛磊鄂 辨捞甫 备茄促. int yoffset = range - yLength; //cout << "yOffset:" << yoffset << endl; if (y1 < y2) ny2 = y2 + yoffset; else ny2 = y2 - yoffset; //cout << "ny2:" << ny2 << endl; double xoffset = (double)(x2 - x1) / (double)(y2 - y1) * (double)yoffset; //cout << "xOffset:" << xoffset << endl; if (x1 < x2) nx2 = x2 + abs((int)xoffset); else nx2 = x2 - abs((int)xoffset); //nx2 = x2 - (int)xoffset; //cout << "nx2:" << nx2 << endl; getPointsFromLine(x1, y1, nx2, ny2, rList); } // getPointsFromLineEx()绰 x^2 + y^2 = r^2苞 y = ax狼 背痢阑 茫酒辑, // 盔痢俊辑 背痢鳖瘤狼 谅钎甸阑 府胶飘肺 府畔窍绰 窃荐牢单, // 舅绊府硫 惑俊辑狼 巩力肺 牢秦 (x2,y2), 溜 贸澜俊 格钎肺 沁带 // 谅钎啊 狐瘤绰 版快啊 积辨 荐 乐促. // 捞繁 版快甫 规瘤窍扁 困秦辑 府胶飘俊 盔贰 格钎 谅钎啊 绝促搁, // 笼绢持绢 霖促. bool bAdd = true; list<POINT>::iterator itr = rList.begin(); for (; itr != rList.end(); itr++) { if (((*itr).x == x2) && ((*itr).y == y2)) { bAdd = false; break; } } if (bAdd) { rList.push_front(POINT(x2, y2)); } return rList.size();}uint getPointsFromVLineEx(int y1, int y2, int X, int range, list<POINT>& rList){ int yLength = abs(y2 - y1); if (yLength < range) { if (y2 > y1) y2 = y2 + range - yLength; else y2 = y2 - range + yLength; } return getPointsFromVLine(y1, y2, X, rList);}uint getPointsFromHLineEx(int x1, int x2, int Y, int range, list<POINT>& rList){ int xLength = abs(x2 - x1); if (xLength < range) { if (x2 > x1) x2 = x2 + range - xLength; else x2 = x2 - range + xLength; } return getPointsFromHLine(x1, x2, Y, rList);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -