计算几何 - Triangle Fun - UVA 11437

计算几何 - Triangle Fun - UVA 11437

题意:

给 定 三 角 形 A B C 的 三 个 顶 点 坐 标 , 给定三角形ABC的三个顶点坐标, ABC

设 点 D 是 B C 边 上 靠 近 B 的 三 等 分 点 , E 是 A C 上 靠 近 C 的 三 等 分 点 , F 是 A B 上 靠 近 A 的 三 等 分 点 。 设点D是BC边上靠近B的三等分点,E是AC上靠近C的三等分点,F是AB上靠近A的三等分点。 DBCBEACCFABA

连 接 A D , B E , C F , 连接AD,BE,CF, ADBECF

A D 与 B E 交 于 点 P , B E 与 C F 交 于 点 Q , A D 与 C F 交 于 点 R 。 AD与BE交于点P,BE与CF交于点Q,AD与CF交于点R。 ADBEPBECFQADCFR

计 算 三 角 形 P Q R 的 面 积 。 计算三角形PQR的面积。 PQR

如下图:
在这里插入图片描述
输入:

T 组 测 试 数 据 , 每 组 包 括 三 个 点 的 坐 标 , 依 次 为 A 、 B 、 C 。 T组测试数据,每组包括三个点的坐标,依次为A、B、C。 TABC

输出:

四 舍 五 入 为 一 个 整 数 , 表 示 三 角 形 P Q R 的 面 积 。 四舍五入为一个整数,表示三角形PQR的面积。 PQR

Sample Input

2
3994.707 9251.677 4152.916 7157.810 5156.835 2551.972
6903.233 3540.932 5171.382 3708.015 213.959 2519.852

Sample Output

98099
206144

数据范围:

0 < N < 1001 , 0 ≤ A x , A y , B x , B y , C x , C y ≤ 10000 0 < N < 1001,0 ≤ Ax, Ay, Bx, By, Cx, Cy ≤ 10000 0<N<10010Ax,Ay,Bx,By,Cx,Cy10000

分析:

根 据 给 定 的 A 、 B 、 C 的 坐 标 , 先 计 算 出 D 、 E 、 F 的 坐 标 , 分 别 处 在 B C → 、 C A → 、 A B → 的   1 3   处 。 根据给定的A、B、C的坐标,先计算出D、E、F的坐标,分别处在\overrightarrow{BC}、\overrightarrow{CA}、\overrightarrow{AB}的\ \frac{1}{3}\ 处。 ABCDEFBC CA AB  31 

接 着 计 算 P 、 Q 、 R 的 坐 标 , 分 别 为 线 段 A D 和 B E 的 交 点 、 B E 和 C F 的 交 点 、 A D 和 C F 的 交 点 。 接着计算P、Q、R的坐标,分别为线段AD和BE的交点、BE和CF的交点、AD和CF的交点。 PQR线ADBEBECFADCF

最 后 利 用 向 量 的 叉 积 计 算 三 角 形 P Q R 的 面 积 S △ P Q R = ∣ P Q → × P R → ∣ × 1 2 最后利用向量的叉积计算三角形PQR的面积S_{\triangle _{PQR}}=|\overrightarrow{PQ}×\overrightarrow{PR}|×\frac{1}{2} PQRSPQR=PQ ×PR ×21

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

const double eps=1e-10;
const double pi=acos(-1.0);

struct Point 
{
    double x,y;
    Point(double x=0,double y=0) : x(x), y(y) {}
};

//点与向量
typedef Point Vector;

Vector operator + (Vector A,Vector B) { return Vector(A.x+B.x,A.y+B.y); }

Vector operator - (Point A,Point B) { return Vector(A.x-B.x,A.y-B.y); }

Vector operator * (Vector A,double p) { return Vector(A.x*p,A.y*p); }

Vector operator / (Vector A,double p) { return Vector(A.x/p,A.y/p); }

bool operator < (const Point &a,const Point &b)
{
    return a.x<b.x || (a.x==b.x && a.y<b.y);
}

int dcmp(double x)
{
    if(fabs(x)<eps) return 0;
    else return x<0 ? -1 : 1;
}

bool operator == (const Point &a, const Point &b)
{
    return dcmp(a.x-b.x)==0 && dcmp(a.y-b.y)==0;
}

double Dot(Vector A,Vector B) { return A.x*B.x + A.y*B.y; }

double Length(Vector A) { return sqrt(Dot(A,A)); }

double Angle(Vector A, Vector B) { return acos(Dot(A,B) / Length(A) / Length(B)); } //A和B夹角

double Cross(Vector A, Vector B) { return A.x*B.y - A.y*B.x; }  //若A到B逆时针则为正,否则为负

double Area2(Point A,Point B,Point C) { return Cross(B-A,C-A); }    //三角形ABC的面积的两倍(有方向)

//点和直线
struct Line
{//直线定义
    Point v, p;
    Line(Point v, Point p):v(v), p(p) {}
    Point point(double t)
    {//返回点P = v + (p - v)*t
        return v + (p - v)*t;
    }
};

Point GetLineIntersection(Point P,Vector v,Point Q,Vector w)    //求过点P的向量v方向上的直线与过点Q的向量w上的直线的交点
{
    Vector u=P-Q;
    double t=Cross(w,u)/Cross(v,w);
    return P+v*t;
}

Point V[5];
Point D,E,F,P,Q,R;
Point &A=V[0], &B=V[1], &C=V[2];

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        for(int i=0;i<3;i++) scanf("%lf%lf",&V[i].x,&V[i].y);
        
        Line AB=Line(A,B), BC=Line(B,C), CA=Line(C,A);
        D=BC.point(1.0/3.0), E=CA.point(1.0/3.0), F=AB.point(1.0/3.0);

        Line AD=Line(A,D), CF=Line(C,F), BE=Line(B,E);
        Vector AP=D-A, CR=F-C, BQ=E-B;

        P=GetLineIntersection(A,AP,B,BQ);
        Q=GetLineIntersection(C,CR,B,BQ);
        R=GetLineIntersection(C,CR,A,AP);
        Vector PQ=Q-P, PR=R-P;

        double area=fabs(Cross(PQ,PR)/2);
        printf("%d\n",int(area+0.5));
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值