计算几何

tim
通过计算面积比例得出两直线的交点位置

double area(double x1,double y1,double x2,double y2,double x3,double y3){
    double s=0.5*((x1*y2-x2*y1)+(x2*y3-x3*y2)+(x3*y1-x1*y3));
    return s;
}//三点计算三角形面积公式A1(X1,Y1),A2(X2,Y2),A3(X3,Y3)逆时针输入
//面积结果为负时A3在A1A2的右边(A1-〉A2-〉A3实际为顺时针)
#include<bits/stdc++.h>
using namespace std;
int n, m;
int xs, ys, xt, yt;
double x[1010], y[1010];
vector<double> kk[1010];
double area(double x1,double y1,double x2,double y2,double x3,double y3){
    double s=0.5*((x1*y2-x2*y1)+(x2*y3-x3*y2)+(x3*y1-x1*y3));
    return s;
}
int main(){
    scanf("%d %d",&n,&m);
    scanf("%d %d %d %d",&xs,&ys,&xt,&yt);
    for(int i=1;i<=n;i++){
        scanf("%lf%lf",&x[i],&y[i]);
    }
    for(int i=1;i<=n;i++) {
        for(int j=i+1;j<=n;j++) {
            double k=area(x[i],y[i],xs,ys,x[j],y[j]);//逆时针输入
            k/=k+area(x[i],y[i],x[j],y[j],xt,yt);//
            if(k>=0&&k<=1){//在线段上
                kk[i].push_back(k);
                kk[j].push_back(k);
            }
        }
    }
    while(m--){
        int ii, cnt;
        scanf("%d %d",&ii,&cnt);
        sort(kk[ii].begin(),kk[ii].end());
        if(cnt>kk[ii].size())puts("-1");
        else 
            printf("%0.6lf %0.6lf\n",kk[ii][cnt-1]*(xt-xs)+xs,
                   kk[ii][cnt-1]*(yt-ys)+ys);
    }
    return 0;
}
全部评论
女少口阿,画了个图瞬间理解大佬思路,通过连接两个风车点(a, b)与起点 s ,终点 t 分别连接成三角形Sabs, Sabt,有公共边a, b,则在ab上的高就和两三角形面积成比例,高成比例的话,根据三角形相似,以两直线ab, st的交点c,分成的两条边sc, ct的比也等于高之比,在判断比例点是否在线段st 上。
点赞 回复 分享
发布于 2021-04-05 20:31

相关推荐

ldf李鑫:不说公司名祝你以后天天遇到这样的公司
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务