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; }