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\n",minn);
    }
}

原文地址:https://www.cnblogs.com/ydw--/p/11369439.html

时间: 2024-10-07 13:57:32

Fermat Point in Quadrangle(hdu 3694 求两直线交点的相关文章

HDU 3694 Fermat Point in Quadrangle (费马定理求四边形的费马点)

题意:给你四个点,找出一个点到四个点的距离最小 四边形的费马点:凸边形是两对角线的交点,凹边形式凹点. PS: 三角形的费马点: 1.若三角形3个内角均小于120°,那么3条距离连线正好三等分费马点所在的周角,即该点所对三角形三边的张角相等,均为120°.所以三角形的费马点也称为三角形的等角中心. 2.若三角形有一内角大于等于120°,则此钝角的顶点就是距离和最小的点. #include<stdio.h> #include<string.h> #include<stdlib.

编程求取直线一般式表达式,两直线交点

背景介绍 ??最近在水面无人艇(USV)模拟仿真中,用到了一些点和线的关系求解,本文主要讲述一下两点确认直线,点到直线距离,两条直线的交点等问题的解决方法,并给出python程序.部分内容非原创,文中给出链接,需要者可以参考. 两点确定直线 表达式定义 ??空间直线的表达式有多种,比如一般式Ax+By+C=0.点斜式y-y0=k(x-x0).截距式x/a+y/b=1.两点式:(y-y1)/(y1-y2)=(x-x1)/(x1-x2)等,它们具有彼此的约束条件,如下所示. ??由上可以看出来,一般

Intersecting Lines---poj1269(求两直线的位置关系)

题目链接:http://poj.org/problem?id=1269 题意:给你两条直线上的任意不同的两点,然后求两条直线的位置关系,如果相交于一点输出该点坐标; #include<iostream> #include<algorithm> #include<math.h> #include<string.h> #include<stdio.h> #include<map> #include<vector> #inclu

hdu 5120 (求两圆相交的面积

题意:告诉你两个圆环,求圆环相交的面积. /* gyt Live up to every day */ #include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<stack> #include<cstring> #include<queue> #include<set&

hdu 5120 (求两圆相交的面积的公式)

S = A大B大 - A大B小 - A小B大 + A小B小.(A表示A环,大表示大圆,B同).然后直接套模板,,,, 1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #include <cmath> 5 using namespace std; 6 7 const double eps = 1e-8; 8 const double PI = acos(-1.0); 9 1

Gym - 101915B Ali and Wi-Fi 计算几何 求两圆交点

题面 题意:给你n个圆,每个圆有一个权值,你可以选择一个点,可以获得覆盖这个点的圆中,权值最大的m个的权值,问最多权值是多少 题解:好像是叙利亚的题....我们画画图就知道,我们要找的就是圆与圆交的那部分里面的点,我们再仔细看看, 2个圆的交点一定在啊! 别急啊,两个圆包含了,都是交点,取哪呢?当然小圆圆心就够了啊(圆又不多,写的时候直接把所有的圆心都丢进去了) 然后枚举判断每个点有没有被在m个圆中就行了,这里维护最大的m个,用个堆就好了 1 #include<bits/stdc++.h> 2

求两直线/线段交点方法集锦

先收集,再补充 向量 http://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect/565282# 参数方程:http://book.2cto.com/201208/2894.html 定比分点:http://blog.csdn.net/dgq8211/article/details/7952825 解直线方程(行列式):http://www.cnblogs.com/i-

Qt中求两线段交点

QPointF MapEditor::getIntersectPos(QPointF posA, QPointF posB, QPointF posC, QPointF posD)//返回AB与CD交点,无交点返回(0,0) { QLineF line1(posA, posB); QLineF line2(posC, posD); QPointF interPos(0,0); QLineF::IntersectType type = line1.intersect(line2, &interPo

zoj 1280 Intersecting Lines(两直线交点)

题意:n组数据,每组两条直线两端点坐标,判断线段平行.重合,相交: 思路:利用叉积跨立实验判断重合与平行,交点公式求交点:zoj过了,可是poj1269过不了,不知道为什么.. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const double epsi=1e-10; inline int sign(const dou