根据两点计算直线方程函数(及求两线交点函数)
[編輯] [转简体] (简体译文)
|
作者:huidong
| 分類:【編程】雜項
[
25 瀏覽
0 評論
5 贊
6 踩
]
概要
正文
y=kx+b,初中就知道。
#include <graphics.h> #include <math.h> #include <conio.h> // 直线方程 struct Line { double k = 0; // 系数,为 0 表示横线(常函数) // 直线不为竖线时,此值表示竖直偏移量 // 直线为竖线时,此值表示水平偏移量 double b = 0; bool isVertical = false; // 是否为竖线 }; // 根据两点计算直线方程 Line GetLineOfPoints(POINT p1, POINT p2) { Line l; if (p1.x == p2.x) { l.isVertical = true; l.b = p1.x; } else { l.k = (double)(p1.y - p2.y) / (p1.x - p2.x); l.b = (double)p1.y - l.k * p1.x; } return l; } // 获取两直线交点 // 返回 -1 表示无交点(两条线平行) // 返回 0 表示有一个交点 // 返回 1 表示有无穷个交点(两条线重叠) int GetLinesIntersection(Line l1, Line l2, POINT* p) { // 若存在至少一条竖线的解 Line pl[2] = { l1,l2 }; for (int i = 0; i < 2; i++) { if (pl[i].isVertical) { if (pl[!i].isVertical) { if (pl[i].b == pl[!i].b) { *p = { (LONG)pl[i].b,0 }; return 1; } else { return -1; } } else { *p = { (LONG)pl[i].b,(LONG)(pl[!i].k * pl[i].b+ pl[!i].b) }; return 0; } } } // 两条斜线的解 double x = (l2.b - l1.b) / (l1.k - l2.k); double y = l1.k * x + l1.b; *p = { (LONG)x,(LONG)y }; return 0; } // 获取直线在某处的值 double GetLineValue(Line line, double x) { if(line.isVertical) { return (0 / 0); } else { return line.k * x + line.b; } } int main() { initgraph(640, 480); POINT p[4] = { {70,300}, {400,50}, {90,120}, {330,422} }; Line l[2]; l[0] = GetLineOfPoints(p[0], p[1]); l[1] = GetLineOfPoints(p[2], p[3]); setfillcolor(GREEN); for(int i=p[0].x; i<p[1].x; i++) { solidcircle(i,GetLineValue(l[0],i),2); } setfillcolor(LIGHTBLUE); for(int i=p[2].x; i<p[3].x; i++) { solidcircle(i,GetLineValue(l[1],i),2); } POINT pi; if(GetLinesIntersection(l[0],l[1],&pi) == 0) { setlinestyle(PS_SOLID,2); circle(pi.x,pi.y,10); } getch(); closegraph(); return 0; }