huidong

首页 | 会员登录 | 关于争取 2022 寒假做出汇东网 Ver3.0.0 !
搜索文章


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



返回首页


Copyright (C) 2018-2024 huidong