poj 1269 Intersecting Lines——叉积求直线交点坐标

题目:http://poj.org/problem?id=1269

相关知识:

叉积
求面积:https://www.cnblogs.com/xiexinxinlove/p/3708147.html
什么是叉积:https://blog.csdn.net/sunbobosun56801/article/details/78980467
        其二维:https://blog.csdn.net/qq_38182397/article/details/80508303
计算交点:
    方法1:面积的比例:https://blog.csdn.net/dgq8211/article/details/7952825
    方法2:叉积:https://blog.csdn.net/hktkfly6/article/details/69218777
            (其原因:https://www.jianshu.com/p/3468c9967fc7
例题:POJ1269:https://www.xuebuyuan.com/1979631.html

此题的链接使用的就是那个面积比例的方法。但自己不是很懂,所以用了那个另一种方法。

利用面积算交点坐标应该还可以:https://www.cnblogs.com/Narh/p/9663099.html

  设直线有两个参数:p->起点坐标;t->终点坐标减起点坐标。设有线段 a 和 b 。设交点为 r 。

  double d=( (a.p-b.p)×a.t ) / ( b.t×a.t ) ,r = a.p + d * a.t ;

  那个 d 就是面积比,即交点与一条线段的相对该线段起点的坐标值之比。

    画一画,分子就是三角形面积的两倍,分母是那样的平行四边形的面积,但连一下发现它就是两线交叉的那个四边形的面积的两倍。面积比即高的比即那两段线段之比。

关于这种方法的 a、b、c 怎么算,可以这样想:y=k*x+b 又 a*x+b*y+c=0 ,所以 a : b : c = -k : 1 : b;

  已知一条直线的两个点的坐标,联立可得 k=( y1-y2 ) / ( x1-x2 ) ; b=( x1*y2 - y1*x2 ) / ( x1-x2 ) ;

  所以 a : b : c = ( y2-y1) : ( x1-x2 ) : ( x1*y2 - y1*x2 ) 。可以说它们就等于这个,因为另一侧是0,可以随便乘。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define db double
using namespace std;
int T,tx,ty;
struct Pt{
    db x,y;
    Pt(db x=0,db y=0):x(x),y(y) {}
}ta,tb;
struct Line{
    Pt p,t;
}a,b;
int operator* (const Pt &a,const Pt &b)
{return a.x*b.y-a.y*b.x;}
Pt operator- (const Pt &a,const Pt &b)
{return Pt(a.x-b.x,a.y-b.y);}
int check(Line a,Line b)
{
    int d1=(b.p-a.p)*(a.t-a.p);
    int d2=(b.t-a.p)*(a.t-a.p);
    if(!d1&&!d2) return -1;//line
    if(d1==d2) return 1;//none
    if(d1*d2<=0) return 0;//point ==0 for 端点相交
}
Pt find(Line a,Line b)
{
    db x1=a.p.x,y1=a.p.y,x2=a.t.x,y2=a.t.y;
    db a0=y2-y1,b0=x1-x2,c0=y1*x2-x1*y2;
    x1=b.p.x,y1=b.p.y,x2=b.t.x,y2=b.t.y;
    db a1=y2-y1,b1=x1-x2,c1=y1*x2-x1*y2;
    int tmp=a0*b1-a1*b0;
    return Pt((b0*c1-b1*c0)/tmp,(-a0*c1+a1*c0)/tmp);
}
int main()
{
    scanf("%d",&T);
    puts("INTERSECTING LINES OUTPUT");
    while(T--)
    {
        scanf("%d%d",&tx,&ty); ta=Pt(tx,ty);
        scanf("%d%d",&tx,&ty); tb=Pt(tx,ty);
        a.p=ta; a.t=tb;
        scanf("%d%d",&tx,&ty); ta=Pt(tx,ty);
        scanf("%d%d",&tx,&ty); tb=Pt(tx,ty);
        b.p=ta; b.t=tb;
        int d=check(a,b);
        if(d==-1) puts("LINE");
        else if(d==1) puts("NONE");
        else
        {
            printf("POINT ");
            Pt c=find(a,b);
            printf("%.2lf %.2lf\n",c.x,c.y);
        }
    }
    puts("END OF OUTPUT");
    return 0;
}

原文地址:https://www.cnblogs.com/Narh/p/9678068.html

时间: 2024-10-13 01:12:28

poj 1269 Intersecting Lines——叉积求直线交点坐标的相关文章

poj 1269 Intersecting Lines(判相交交点与平行)

http://poj.org/problem?id=1269 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10379   Accepted: 4651 Description We all know that a pair of distinct points on a plane defines a line and that a pair of lines on a plane will intersect in

POJ 1269 Intersecting Lines【判断直线相交】

题意:给两条直线,判断相交,重合或者平行 思路:判断重合可以用叉积,平行用斜率,其他情况即为相交. 求交点: 这里也用到叉积的原理.假设交点为p0(x0,y0).则有: (p1-p0)X(p2-p0)=0 (p3-p0)X(p2-p0)=0 展开后即是 (y1-y2)x0+(x2-x1)y0+x1y2-x2y1=0 (y3-y4)x0+(x4-x3)y0+x3y4-x4y3=0 将x0,y0作为变量求解二元一次方程组. 假设有二元一次方程组 a1x+b1y+c1=0; a2x+b2y+c2=0

POJ 1269 Intersecting Lines(判断直线相交)

题目地址:POJ 1269 直接套模板就可以了...实在不想自己写模板了...写的又臭又长....不过这题需要注意的是要先判断是否有直线垂直X轴的情况. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h>

POJ 1269 Intersecting Lines(线段相交,水题)

Intersecting Lines 大意:给你两条直线的坐标,判断两条直线是否共线.平行.相交,若相交,求出交点. 思路:线段相交判断.求交点的水题,没什么好说的. struct Point{ double x, y; } ; struct Line{ Point a, b; } A, B; double xmult(Point p1, Point p2, Point p) { return (p1.x-p.x)*(p2.y-p.y)-(p1.y-p.y)*(p2.x-p.x); } bool

判断两条直线的位置关系 POJ 1269 Intersecting Lines

两条直线可能有三种关系:1.共线     2.平行(不包括共线)    3.相交. 那给定两条直线怎么判断他们的位置关系呢.还是用到向量的叉积 例题:POJ 1269 题意:这道题是给定四个点p1, p2, p3, p4,直线L1,L2分别穿过前两个和后两个点.来判断直线L1和L2的关系 这三种关系一个一个来看: 1. 共线. 如果两条直线共线的话,那么另外一条直线上的点一定在这一条直线上.所以p3在p1p2上,所以用get_direction(p1, p2, p3)来判断p3相对于p1p2的关

POJ 1269 - Intersecting Lines - [平面几何模板题]

题目链接:http://poj.org/problem?id=1269 Time Limit: 1000MS Memory Limit: 10000K Description We all know that a pair of distinct points on a plane defines a line and that a pair of lines on a plane will intersect in one of three ways: 1) no intersection b

poj 1269 Intersecting Lines(判断两直线关系,并求交点坐标)

Intersecting Lines Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12421   Accepted: 5548 Description We all know that a pair of distinct points on a plane defines a line and that a pair of lines on a plane will intersect in one of three

POJ 1269 Intersecting Lines (判断直线位置关系)

题目链接:POJ 1269 Problem Description We all know that a pair of distinct points on a plane defines a line and that a pair of lines on a plane will intersect in one of three ways: 1) no intersection because they are parallel, 2) intersect in a line becau

简单几何(直线位置) POJ 1269 Intersecting Lines

题目传送门 题意:判断两条直线的位置关系,共线或平行或相交 分析:先判断平行还是共线,最后就是相交.平行用叉积判断向量,共线的话也用叉积判断点,相交求交点 /************************************************ * Author :Running_Time * Created Time :2015/10/24 星期六 09:08:55 * File Name :POJ_1269.cpp *********************************