UVA 11178 Morley's Theorem——直线相交

本文介绍了一种基于向量运算的几何计算方法,包括点、向量操作、旋转及求交等基本图形处理技术,并通过具体算法实现了一个计算几何中求解特定点的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const double eps = 1e-5;
const double PI = acos(-1.0);
struct Point {
    double x, y;
    Point (double xx = 0.0, double yy = 0.0) : x(xx), y(yy) {}
};
typedef Point Vector;

Point operator + (const Point &p1, const Point &p2) { return Point(p1.x + p2.x, p1.y + p2.y); }
Point operator - (const Point &p1, const Point &p2) { return Point(p1.x - p2.x, p1.y - p2.y); }
Vector operator * (const Vector &v, double x) { return Vector(v.x*x, v.y*x); }

double Dot(Vector v1, Vector v2) { return v1.x*v2.x+v1.y*v2.y; }

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

double Angle(Vector v1, Vector v2) { return acos(Dot(v1, v2) / Length(v1) / Length(v2)); }

double Cross(Vector v1, Vector v2) { return v1.x*v2.y - v1.y*v2.x; }

Vector Rotate(Vector v, double rad) { return Vector(v.x*cos(rad) - v.y*sin(rad), v.x*sin(rad) + v.y*cos(rad)); }

Point GetLineIntersection(Point P, Vector v, Point Q, Vector w) {
      Vector u = P - Q;
      double t = Cross(w, u) / Cross(v, w);
      return P + v*t;
}

Point Solve(Point p1, Point p2, Point p3) {
    Vector v1 = p2 - p1, v2 = p3 - p1, v3 = p3 - p2;
    double angle1 = Angle(v1, v2), angle2 = PI - Angle(v1, v3);
    angle1 /= 3.0, angle2 /= 3.0;
    Vector t1 = Rotate(v1, angle1), t2 = Rotate(v1, PI - angle2);
    return GetLineIntersection(p1, t1, p2, t2);
}

int main() {
    int T; scanf("%d", &T);
    Point A, B, C, D, E, F;
    for (int kase = 1; kase <= T; kase++) {
        scanf("%lf %lf %lf %lf %lf %lf", &A.x, &A.y, &B.x, &B.y, &C.x, &C.y);
        D = Solve(B, C, A);
        E = Solve(C, A, B);
        F = Solve(A, B, C);
        printf("%lf %lf %lf %lf %lf %lf\n", D.x, D.y, E.x, E.y, F.x, F.y);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值