1059. Exocenter of a Trian

#include<stdio.h>
const double eps = 1e-8;
typedef struct{
   double x;
   double y;
} CPoint;

int dcmp(double x){
// if(x<0) return -1; if(x==0)return 0; if(x>0)return 1;
  if(x<-eps) return -1;else return (x > eps);
}

double cross(CPoint p0, CPoint p1, CPoint p2){
//p1p0 >< p2p0
    return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x)*(p1.y - p0.y);
}
double dot(CPoint p0, CPoint p1, CPoint p2){
    return (p1.x - p0.x) * (p2.x - p0.x) + (p1.y - p0.y) * (p2.y - p0.y) ;
}

int LineIntersection(CPoint p1, CPoint p2, CPoint p3, CPoint p4, CPoint &cp){
    double u = cross(p1, p2, p3), v = cross(p2, p1, p4);
    if(dcmp(u + v)){
        cp.x =(p3.x * v + p4.x * u ) / (u+v);
        cp.y =(p3.y * v + p4.y * u)/(u+v);
        return 1;
    }
    if(dcmp(u) )return 0;
    if( dcmp( cross(p3,p4,p1) ) ) return 0;
    return -1;
 
}

int N;
double x[3],y[3];
double tx[6] , ty[6] , mx[3] , my[3];
int main(){
     scanf("%d", &N);
     while( N-- ){
           int i , j ,cnt = 0;;
           for(i = 0; i < 3; i++)scanf("%lf%lf", x + i , y + i);

           for(i = 0; i < 3; i++){
              j = (i + 1) % 3;
              tx[cnt] = x[i] - y[j] + y[i];
              ty[cnt] = y[i] + x[j] - x[i];
              cnt++;
              tx[cnt] = x[j] + y[i] - y[j];
              ty[cnt] = y[j] - x[i] + x[j];
              cnt++;
           }
           i = 5; 
           for( cnt = 0; cnt < 3; cnt++){
                mx[cnt] = (tx[i] + tx[ (i+1) % 6 ])/2;
                my[cnt] = (ty[i] + ty[ (i+1) % 6 ])/2;
                i = (i + 2) % 6;
           }
           CPoint p1,p2,p3,p4,cp;
           p1.x = mx[0] ; p1.y = my[0];
           p2.x = x[0] ; p2.y = y[0];
           p3.x = mx[1]; p3.y = my[1];
           p4.x = x[1] ; p4.y = y[1];
           LineIntersection(p1,p2,p3,p4,cp);
      
           if(cp.x > -0.00005 && cp.x < 0.00005) cp.x = 0;
           if(cp.y > -0.00005 && cp.y < 0.00005) cp.y = 0;
           printf("%.4lf %.4lf\n", cp.x, cp.y);
     }
}

直接模拟做的~初次接触计算几何,感觉好神奇,太好玩啦~


找出L N点坐标,直接求直线交点。

用叉积的概念做本题。

注意结果:0时的精度问题  -0.00004 会近似至 -0.0000 ,输出负号是不对的。

下面的例子就说明白了:

if(cp.x > -0.00005 && cp.x < 0.00005) cp.x = 0;可以

if(cp.x > -0.00005 && cp.x < 0) cp.x = 0; 错误

if(cp.x > -0.00005 && cp.x < eps) cp.x = 0; 可以

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值