#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; 可以