判断圆与射线是否相交

风流意气都作罢 提交于 2020-02-29 21:02:42

给定2个点的坐标A和B,代表有一条射线AB。
再给定一个点的坐标O点和一个半径R,代表以O为圆心以R为半径的一个圆。
问射线与圆是否有公共点,即存在某个点既在射线上又在圆上。
输入一共7个数,均为不超过100的非负整数。
输出一行,存在这个点就输出Y,否则输出N。
测试举例:
测试输入:2 3 2 100 2 1 1
预期输出:N
测试输入:1 0 1 100 2 1 1
预期输出:Y
向量乘法:
a∗b=∣a∣∗∣b∣∗cosxa * b = |a| * |b| * cosx
a∗b=∣a∣∗∣b∣∗cosx向量的坐标相乘:
(x1,y1)∗(x2,y2)=x1∗x2+y1∗y2(x1,y1)*(x2,y2)=x1 * x2+y1 * y2(x1,y1)∗(x2,y2)=x1∗x2+y1∗y2提示:
在这里插入图片描述
比较∠OAB和∠OAP的大小,如果∠OAB不大于∠OAP,则圆与射线相交。
可以通过比较sin值判断大小。

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
 int x1,y1,x2,y2,xo,yo;
 double r,l,k=0;
 cin>>x1>>y1>>x2>>y2>>xo>>yo>>r;
 k=(y2-y1)/(x2-x1);
 l=abs(k*xo-yo+y1-k*x1)/(sqrt(k*k+1));
 if(l==r)
 {
  cout<<'Y';
 }
 else
 {
  cout<<'N';
 }
}

#include <iostream>
#include <cmath>
using namespace std;
float len(int x1,int y1,int x2,int y2)
{
      int t = (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2);
      return sqrt(t);
}
int main()
{
    int xa,ya,xb,yb,xo,yo,R;
    cin>>xa>>ya>>xb>>yb>>xo>>yo>>R;
    if(xa==xb && ya==yb) 
 {
  cout<<"N";return 0;
 }
    float OA = len(xa,ya,xo,yo);
    float OB = len(xb,yb,xo,yo);
    if(OA<=(float)R || OB<=(float)R) 
 {
  cout<<"Y";return 0;
 }
    else
 {
     int son_cos = (xo-xa)*(xb-xa)+(yo-ya)*(yb-ya);
     float mother_cos = len(xa,ya,xo,yo)*len(xa,ya,xb,yb);
     float cos = (float)son_cos/mother_cos;
     float my_sin = sqrt(1-cos*cos);
     float sin = (float)R/len(xa,ya,xo,yo);
     if(cos<=0)
  {
   cout<<"N";
   return 0;
  }
     else if(my_sin<=sin) 
  { 
   cout<<"Y";
   return 0;
  }
      else 
  {
   cout<<"N";
   return 0;
  }
}  
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!