zoukankan      html  css  js  c++  java
  • Fermat Point in Quadrangle(hdu 3694 求两直线交点

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3694

    画几个图应该就可以知道凸四边形就是对角线交点 凹四边形就是凹进去的那个点

    so 只要枚举四个点以及对角线交点 找个minn就可以

    求两直线交点模板:

    double cross(double x1,double y1,double x2,double y2)
    {
        return x1*y2-x2*y1;
    }
    bool getcross(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4,double &tx,double &ty)
    {
        double A1=y2-y1;
        double B1=x1-x2;
        double C1=cross(x1,y1,x2,y2);
        double A2=y4-y3;
        double B2=x3-x4;
        double C2=cross(x3,y3,x4,y4);
        if(fabs(cross(A1,B1,A2,B2))<1e-6)return 0;
        tx=cross(C1,B1,C2,B2)/cross(A1,B1,A2,B2);
        ty=cross(A1,C1,A2,C2)/cross(A1,B1,A2,B2);
        return 1;
    }
    int main()
    {
        int i,j;
        double x1,x2,x3,x4,y1,y2,y3,y4;
        while(~scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4))
        {
            double ty,tx;
            if(getcross(x1,y1,x2,y2,x3,y3,x4,y4,tx,ty))cout<<tx<<" "<<ty<<endl;
        }
    }

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    double dis(double x2,double y2,double x1,double y1)
    {
        return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
    }
    double minn,x[7],y[7];
    void judge(double x1,double y1)
    {
        int i;
        double sum=0;
        for(i=1;i<=4;i++)
        {
            sum+=dis(x1,y1,x[i],y[i]);
        }
        if(sum<minn)minn=sum;
    }
    double cross(double x1,double y1,double x2,double y2)
    {
        return x1*y2-x2*y1;
    }
    bool getcross(int a,int b,int c,int d,double &tx,double &ty)//求两直线交点
    {
        double A1=y[b]-y[a];
        double B1=x[a]-x[b];
        double C1=cross(x[a],y[a],x[b],y[b]);
        double A2=y[d]-y[c];
        double B2=x[c]-x[d];
        double C2=cross(x[c],y[c],x[d],y[d]);
        if(fabs(cross(A1,B1,A2,B2))<1e-6)return 0;
        tx=cross(C1,B1,C2,B2)/cross(A1,B1,A2,B2);
        ty=cross(A1,C1,A2,C2)/cross(A1,B1,A2,B2);
        return 1;
    }
    int main()
    {
        int i,j;
        while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x[1],&y[1],&x[2],&y[2],&x[3],&y[3],&x[4],&y[4]),x[1]>=0)
        {
            minn=0x3f3f3f3f;
            double ty,tx;
            for(i=1;i<=4;i++)judge(x[i],y[i]);
            if(getcross(1,2,3,4,tx,ty))judge(tx,ty);
            if(getcross(1,3,2,4,tx,ty))judge(tx,ty);
            if(getcross(1,4,2,3,tx,ty))judge(tx,ty);
            printf("%.4f
    ",minn);
        }
    }
    View Code
  • 相关阅读:
    [转]常用数字处理算法的Verilog实现
    [转]Linux必学的60个命令
    [转]4位超前进位加法器代码及原理
    [转]FPGA & Verilog开发经验若干
    [转]Verilog中parameter和define的区别
    [转]VIM标记 mark 详解
    关于获取服务的需求列表
    Office 2007 探索之路 Outlook
    利用反射建立单一调用的WebService
    寻宝记
  • 原文地址:https://www.cnblogs.com/ydw--/p/11369439.html
Copyright © 2011-2022 走看看