• poj1673EXOCENTER OF A TRIANGLE


    链接

    据说这题是垂心。。数学太弱没有看出来,写了分朴实无华的代码。。

    旋转三边得到图中的外顶点,然后连接三角形顶点求交点,交上WA。。觉得没什么错误就去看了下discuss,发现都在说精度问题,果断开始水,最后+了epsAC了。。

      1 #include <iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<stdlib.h>
      6 #include<vector>
      7 #include<cmath>
      8 #include<queue>
      9 #include<set>
     10 using namespace std;
     11 #define N 100000
     12 #define LL long long
     13 #define INF 0xfffffff
     14 const double eps = 1e-8;
     15 const double pi = acos(-1.0);
     16 const double inf = ~0u>>2;
     17 struct Point
     18 {
     19     double x,y;
     20      Point(double x=0,double y=0):x(x),y(y) {}
     21 }p[5];
     22 typedef Point pointt;
     23 pointt operator + (Point a,Point b)
     24 {
     25     return Point(a.x+b.x,a.y+b.y);
     26 }
     27 pointt operator - (Point a,Point b)
     28 {
     29     return Point(a.x-b.x,a.y-b.y);
     30 }
     31 int dcmp(double x)
     32 {
     33     if(fabs(x)<eps) return 0;
     34     else return x<0?-1:1;
     35 }
     36 Point rotate(Point a,double rad)
     37 {
     38     return Point(a.x*cos(rad)-a.y*sin(rad),a.x*sin(rad)+a.y*cos(rad));
     39 }
     40 bool intersection1(Point p1, Point p2, Point p3, Point p4, Point& p)      // 直线相交
     41 {
     42     double a1, b1, c1, a2, b2, c2, d;
     43     a1 = p1.y - p2.y;
     44     b1 = p2.x - p1.x;
     45     c1 = p1.x*p2.y - p2.x*p1.y;
     46     a2 = p3.y - p4.y;
     47     b2 = p4.x - p3.x;
     48     c2 = p3.x*p4.y - p4.x*p3.y;
     49     d = a1*b2 - a2*b1;
     50     if (!dcmp(d))    return false;
     51     p.x = (-c1*b2 + c2*b1) / d;
     52     p.y = (-a1*c2 + a2*c1) / d;
     53     return true;
     54 }
     55 double cross(Point a,Point b)
     56 {
     57     return a.x*b.y-a.y*b.x;
     58 }
     59 double mul(Point p0,Point p1,Point p2)
     60 {
     61     return cross(p1-p0,p2-p0);
     62 }
     63 int main()
     64 {
     65     int n,i;
     66     cin>>n;
     67     while(n--)
     68     {
     69         for(i = 1; i <= 3 ; i++)
     70         scanf("%lf%lf",&p[i].x,&p[i].y);
     71         Point p1,p2,p3,p4;
     72         if(dcmp(mul(p[1],p[2],p[3]))>0)
     73         {
     74             p1 = rotate(p[3]-p[1],3*pi/2.0);
     75             p2 = rotate(p[2]-p[1],pi/2.0);
     76         }
     77         else
     78         {
     79             p1 = rotate(p[3]-p[1],pi/2.0);
     80             p2 = rotate(p[2]-p[1],3*pi/2.0);
     81         }
     82         p1.x+=p[1].x;
     83         p1.y+=p[1].y;
     84         p2.x+=p[1].x;
     85         p2.y+=p[1].y;
     86         p1.x = (p1.x+p2.x)/2;
     87         p1.y = (p1.y+p2.y)/2;
     88 
     89         if(dcmp(mul(p[2],p[1],p[3]))>0)
     90         {
     91             p3 = rotate(p[3]-p[2],3*pi/2.0);
     92             p4 = rotate(p[1]-p[2],pi/2.0);
     93         }
     94         else
     95         {
     96             p3 = rotate(p[3]-p[2],pi/2.0);
     97             p4 = rotate(p[1]-p[2],3*pi/2.0);
     98         }
     99         p3.x+=p[2].x;
    100         p3.y+=p[2].y;
    101         p4.x+=p[2].x;
    102         p4.y+=p[2].y;
    103         p3.x = (p3.x+p4.x)/2;
    104         p3.y = (p3.y+p4.y)/2;
    105         Point pp ;
    106         intersection1(p1,p[1],p3,p[2],pp);
    107         printf("%.4f %.4f
    ",pp.x+eps,pp.y+eps);
    108 
    109     }
    110     return 0;
    111 }
    View Code
  • 相关阅读:
    alias 命令
    iptables 命令
    unzip 命令
    gzip 命令
    zip 命令
    tar 命令
    nslookup 命令
    dig 命令
    java 线程池
    java 线程
  • 原文地址:https://www.cnblogs.com/shangyu/p/3850050.html
Copyright © 2020-2023  润新知