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;
}
原创,暂时没发现 bug