zoukankan      html  css  js  c++  java
  • POJ 1269 Intersecting Lines(计算几何)

    题意:给定4个点的坐标,前2个点是一条线,后2个点是另一条线,求这两条线的关系,如果相交,就输出交点。

    题解:先判断是否共线,我用的是叉积的性质,用了2遍就可以判断4个点是否共线了,在用斜率判断是否平行,最后就是相交了,求交点就好了。

    求交点的过程和高中知识差不多,用y=kx+c来求,只不过要注意斜率不存在的时候特殊处理,还有就是求斜率的时候一定要强制转换,(坑爹的我,调试了一小时才找到这个bug)

    AC代码:

    #include <map>
    #include <set>
    #include <list>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <cstdio>
    #include <string>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    const int INF=0x3f3f3f3f;
    typedef long long ll;
    typedef unsigned long long ull;
    #define prN printf("
    ")
    #define SI(N) scanf("%d",&(N))
    #define SII(N,M) scanf("%d%d",&(N),&(M))
    #define SIII(N,M,K) scanf("%d%d%d",&(N),&(M),&(K))
    #define cle(a,val) memset(a,(val),sizeof(a))
    #define rep(i,b) for(int i=0;i<(b);i++)
    #define Rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define reRep(i,a,b) for(int i=(a);i>=(b);i--)
    const int MAX_N= 1 ;
    const int EPS= 1e-9 ;
    int a[10][8],n;
    
    int Multic(int x0,int y0,int x1,int y1,int x2,int y2)
    {
        int a1=x1-x0,b1=y1-y0;
        int a2=x2-x0,b2=y2-y0;
        return a1*b2-a2*b1;
    }
    
    void sol(int row)
    {
        int te1=Multic(a[row][0],a[row][1],a[row][4],a[row][5],a[row][2],a[row][3]);
        int te2=Multic(a[row][0],a[row][1],a[row][6],a[row][7],a[row][2],a[row][3]);
        if (te1==0&&te2==0)
        {
            puts("LINE");
            return;
        }
        if ((a[row][1]-a[row][3])*(a[row][4]-a[row][6])==
                (a[row][0]-a[row][2])*(a[row][5]-a[row][7]))
        {
            puts("NONE");
            return;
        }
        if (a[row][0]-a[row][2]==0||(a[row][4]-a[row][6])==0)
        {
            if (a[row][0]-a[row][2]==0)
            {
                double ansx=a[row][0];
                double k2=(a[row][5]-a[row][7])/(double)(a[row][4]-a[row][6]);
                double c2=a[row][7]-k2*a[row][6];
                double ansy=k2*ansx+c2;
                printf("POINT %.2f %.2f
    ",ansx,ansy);
            }
            if ((a[row][4]-a[row][6])==0)
            {
                double ansx=a[row][4];
                double k1=(a[row][1]-a[row][3])/(double)(a[row][0]-a[row][2]);
                double c1=a[row][1]-k1*a[row][0];
                double ansy=k1*ansx+c1;
            }
            return;
        }
    
        double k1=(a[row][1]-a[row][3])/(double)(a[row][0]-a[row][2]);///一定要注意这 ,要强制类型转换!!!!!!!!!!!!
        double k2=(a[row][5]-a[row][7])/(double)(a[row][4]-a[row][6]);///否则就是int除int了
        
        double c1=a[row][1]-k1*a[row][0];
        double c2=a[row][7]-k2*a[row][6];
        
        double ansx=(c2-c1)/(k1-k2);
        double ansy=k1*ansx+c1;
        
        printf("POINT %.2f %.2f
    ",ansx,ansy);
    }
    
    int main()
    {
        SI(n);
        rep(i,n)
        rep(j,8)
        SI(a[i][j]);
        puts("INTERSECTING LINES OUTPUT");
        rep(i,n)
        sol(i);
        puts("END OF OUTPUT");
        return 0;
    }
    

      

  • 相关阅读:
    P2533 [AHOI2012]信号塔
    P1452 Beauty Contest
    P3194 [HNOI2008]水平可见直线
    P2924 [USACO08DEC]大栅栏Largest Fence
    P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows
    P4208 [JSOI2008]最小生成树计数
    P4280 [AHOI2008]逆序对
    P3199 [HNOI2009]最小圈
    P3343 [ZJOI2015]地震后的幻想乡
    剪刀,石头,布,小游戏脚本
  • 原文地址:https://www.cnblogs.com/s1124yy/p/5520978.html
Copyright © 2011-2022 走看看