Math 从另一个点到两个角度之间的一个点?

Math 从另一个点到两个角度之间的一个点?,math,opengl-es,Math,Opengl Es,我试图确定一个点是否位于从原始点开始的两个角度之间(以确定是否使用OpenGL绘制它,尽管这与此无关)。最简单的方法是什么? 如果角度CAB+BAD的绝对值=45,则点位于内部。如果CAB+BAD>45,则点位于外侧。如果角度的绝对值CAB+BAD=45,则点位于内侧。如果CAB+BAD>45,则点在外部。如果您有点坐标且没有角度,则使用极坐标转换[X,Y]->[R,θ](半径和角度)相对于中心(图中的A),然后比较角度(θ) 此代码将点转换为相对于中心点的极点: /// <summary

我试图确定一个点是否位于从原始点开始的两个角度之间(以确定是否使用OpenGL绘制它,尽管这与此无关)。最简单的方法是什么?

如果角度CAB+BAD的绝对值=45,则点位于内部。如果CAB+BAD>45,则点位于外侧。

如果角度的绝对值CAB+BAD=45,则点位于内侧。如果CAB+BAD>45,则点在外部。

如果您有点坐标且没有角度,则使用极坐标转换[X,Y]->[R,θ](半径和角度)相对于中心(图中的A),然后比较角度(θ)

此代码将点转换为相对于中心点的极点:

/// <summary>
/// Converts Point to polar coordinate point
/// </summary>
public static PolarPoint PointToPolarPoint(Point center, Point point)
{
  double dist = Distance(center, point);

  double theta = Math.Atan2(point.Y - center.Y, point.X - center.X);

  if (theta < 0)  // provide 0 - 2Pi "experience"
    theta = 2 * Math.PI + theta;

  return new PolarPoint(dist, theta);
}

/// <summary>
/// Calculates distance between two points
/// </summary>
public static int Distance(Point p1, Point p2)  
{
  return (int) Math.Sqrt
         (
           Math.Pow(p1.X - p2.X, 2) +
           Math.Pow(p1.Y - p2.Y, 2)
         );
}
//
///将点转换为极坐标点
/// 
公共静态极点到极点(点中心、点点)
{
双距离=距离(中心、点);
双θ=Math.Atan2(point.Y-center.Y,point.X-center.X);
if(θ<0)//提供0-2Pi“体验”
θ=2*Math.PI+θ;
返回新的极点(距离、θ);
}
/// 
///计算两点之间的距离
/// 
公共静态整数距离(点p1、点p2)
{
return(int)Math.Sqrt
(
数学功率(p1.X-p2.X,2)+
数学能力(p1.Y-p2.Y,2)
);
}
C#中的极轴点类(包括转换回点):

/*ITAdapter提供的NFX
*起始日期:2006.01
*修订:NFX 0.2 2009.02.10
*/
使用制度;
使用System.Collections.Generic;
使用系统图;
使用系统文本;
名称空间NFX.Geometry
{
/// 
///表示具有极坐标的点
/// 
公共结构极点
{
#地区.行政长官
/// 
///初始化极坐标
/// 
公共极点(双r,双θ)
{
m_R=R;
m_θ=0;
θ=θ;
}
/// 
///从二维笛卡尔坐标初始化极坐标
/// 
公共极点(点-中心、点-点)
{
这=笛卡尔螺距。点到最大点(中心,点);
}
#端区
#区域专用字段
私人双保险;
私人双m_θ;
#端区
#区域属性
/// 
///R坐标分量,即距坐标原点的坐标距离
/// 
公共双R
{
获取{return m_R;}
设置{m_R=value;}
}
/// 
///角度方位角坐标组件。角度必须介于0和2Pi之间。
///注:由于屏幕Y坐标从上到下(通常方向)
///θ角可以反转,即-在下半坐标平面中为正。
///请参阅:
///  http://en.wikipedia.org/wiki/Polar_coordinates
/// 
公共双θ
{
获取{return m_Theta;}
设置
{
如果((值<0)| |(值>Math.PI*2))
抛出新的NFXException(“无效极坐标角度”);
m_θ=值;
}
}
/// 
///返回转换为二维笛卡尔坐标的极坐标。
///坐标相对于角度基准顶点的0,0
/// 
公共点
{
得到
{
int x=(int)(m_R*Math.Cos(m_Theta));
int y=(int)(m_R*Math.Sin(m_Theta));
返回新点(x,y);
}
}
#端区
#区域操作员
公共静态布尔运算符==(左极点,右极点)
{
返回(left.m_R==right.m_R)&(left.m_Theta==right.m_Theta);
}
公共静态布尔运算符!=(左极点,右极点)
{
返回(left.m_-R!=right.m_-R)|(left.m_-Theta!=right.m_-Theta);
}
#端区
#区域对象覆盖
公共覆盖布尔等于(对象对象对象)
{
如果(obj是PolarPoint)
返回this==((PolarPoint)obj);
其他的
返回false;
}
公共覆盖int GetHashCode()
{
返回m_R.GetHashCode()+m_Theta.GetHashCode();
}
公共重写字符串ToString()
{
返回string.Format(“距离:{0};角度:{1}rad.”,mur,mutheta);
}
#端区
}
}

如果您有点坐标,但没有角度,则使用极坐标将[X,Y]->[R,θ](半径和角度)相对于中心(图中的A)进行转换,然后比较角度(θ)

此代码将点转换为相对于中心点的极点:

/// <summary>
/// Converts Point to polar coordinate point
/// </summary>
public static PolarPoint PointToPolarPoint(Point center, Point point)
{
  double dist = Distance(center, point);

  double theta = Math.Atan2(point.Y - center.Y, point.X - center.X);

  if (theta < 0)  // provide 0 - 2Pi "experience"
    theta = 2 * Math.PI + theta;

  return new PolarPoint(dist, theta);
}

/// <summary>
/// Calculates distance between two points
/// </summary>
public static int Distance(Point p1, Point p2)  
{
  return (int) Math.Sqrt
         (
           Math.Pow(p1.X - p2.X, 2) +
           Math.Pow(p1.Y - p2.Y, 2)
         );
}
//
///将点转换为极坐标点
/// 
公共静态极点到极点(点中心、点点)
{
双距离=距离(中心、点);
双θ=Math.Atan2(point.Y-center.Y,point.X-center.X);
if(θ<0)//提供0-2Pi“体验”
θ=2*Math.PI+θ;
返回新的极点(距离、θ);
}
/// 
///计算两点之间的距离
/// 
公共静态整数距离(点p1、点p2)
{
return(int)Math.Sqrt
(
数学功率(p1.X-p2.X,2)+
数学能力(p1.Y-p2.Y,2)
);
}
C#中的极轴点类(包括转换回点):

/*ITAdapter提供的NFX
*起始日期:2006.01
*修订:NFX 0.2 2009.02.10
*/
使用制度;
使用System.Collections.Generic;
使用系统图;
使用系统文本;
名称空间NFX.Geometry
u x v = ux * vy - uy * vx = |u| * |v| * sin(phi)
(B - A) x (D - A) > 0
(B - A) x (D - A) > 0 and (B - A) x (C - A) < 0
float cameraAngle = PI + cameraYR;
float angle = PI / 2 + atan2f(cameraY - y, cameraX - x);
float anglediff = fmodf(angle - cameraAngle + PI, PI * 2) - PI;
return (anglediff <= visibleAngle && anglediff >= -visibleAngle) || (anglediff <= -PI * 2 + visibleAngle && angleDiff >= -PI * 2 - visibleAngle);