本文主要是介绍计算两直线的交点 poj 1269 我的第一道几何题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
设读入的四个点分别为A, B, C, D。
首先,算出矢量AB和CD,如果它们的叉积为0,则说明它们的方向是相同或相反的,也就是这两条直线的斜率相等。
若斜率相等,则要进一步判断它们是否为同一条直线,那只需要判断点C是否在直线AB上,如果矢量CA和矢量AB的叉积为0,则说明它们的方向是相同或相反的,那么点C就在直线AB上。
若斜率不相等,则要求交点。如图,C’D’平行CD,v、w、u是三个矢量,E是交点。问题变成:将矢量v“延长”多少倍以后,能变成矢量AE(然后求出新的矢量后加上点A的坐标即可)?通过图形容易得出,其实就是橙色的平行四边形的面积是紫色平行四边形面积的多少倍,这个可以用叉积轻松求出。当然,这只是其中一种可能,其他的也差不多也是这样。
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;const double eps = 1e-8;struct Point {double x, y;Point() {}Point(double a, double b): x(a), y(b) {}inline void Scan() {scanf("%lf%lf", &x, &y);}
};
typedef Point Vector;
inline bool zero(double x) {return abs(x) < eps;}
inline double operator * (Vector a, Vector b) {return a.x * b.y - a.y * b.x;}
inline Vector operator + (Vector a, Vector b) {return Vector(a.x + b.x, a.y + b.y);}
inline Vector operator - (Vector a, Vector b) {return Vector(a.x - b.x, a.y - b.y);}
inline Vector operator * (Vector a, double b) {return Vector(a.x * b, a.y * b);}int main() {printf("INTERSECTING LINES OUTPUT\n");int T;scanf("%d\n", &T);for (; T; T --) {Point a, b, c, d;a.Scan(), b.Scan(), c.Scan(), d.Scan();scanf("\n");Vector v = b - a, w = d - c;if (zero(v * w)) if (zero(v * (b - c)))printf("LINE\n");else printf("NONE\n");else {Point res = a + v * ((w * (a - c)) / (v * w));printf("POINT %.2lf %.2lf\n", res.x, res.y);}}printf("END OF OUTPUT\n");return 0;
}
这篇关于计算两直线的交点 poj 1269 我的第一道几何题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!