Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查点是否位于多边形内_C#_Opengl_Math_Opentk - Fatal编程技术网

C# 检查点是否位于多边形内

C# 检查点是否位于多边形内,c#,opengl,math,opentk,C#,Opengl,Math,Opentk,我创建了一个对象类,并在其上设置了mouseEnter事件。对象描述了使用opengl创建圆的过程(以下是绘图过程函数): public void drawcirle() { GL.Begin(原语类型三角帆); GL.Color4(颜色); GL.顶点2(X,Y); 对于(int i=0;i

我创建了一个对象类,并在其上设置了mouseEnter事件。对象描述了使用opengl创建圆的过程(以下是绘图过程函数):

public void drawcirle()
{
GL.Begin(原语类型三角帆);
GL.Color4(颜色);
GL.顶点2(X,Y);
对于(int i=0;i<360;i++)
{
GL.Vertex2(X_+Math.Cos(i)*半径,Y_+Math.Sin(i)*半径);
}
GL.End();
}
然后我做了一个mouseEvent,但是不能正确地得到光标的坐标。在圆弧上获得点的正确条件是什么? 此函数返回一个点,但左侧有一点偏移(X_u和Y_u是圆心(双类型)半径_u也是双类型):

公共点光标定位
{
得到
{
返回游标位置;
}
设置
{
this.CursorLocation u=值;
对于(int i=0;i<360;i++)
{

如果(光标位置X条件为dx*dx+dy*dy (x,y)是光标位置,(cx,cy)是圆心

所以你要检查圆心和某个点之间的欧几里德距离。为了避免平方根计算,你只需将比较的两边平方即可


使用条件为dx*dx+dy*dy (x,y)是光标位置,(cx,cy)是圆心

所以你要检查圆心和某个点之间的欧几里德距离。为了避免平方根计算,你只需将比较的两边平方即可



使用这不是关于事件或MouseEnter事件,而是关于mathYes,但我描述它是为了理解我以前在面对这个问题时所做的事情。你不使用System.Drawing来绘制圆。也不使用System.Drawing。你似乎在统一地绘制多边形?使用适当的标记并解释你实际上在做什么,问题是什么,否则你会混淆人们请确认!更改了标记。不,是OpenTkyu。您仍然没有提到您使用的库。其中一些库允许您检查一个形状是否与另一个形状相交,或者一个点是否位于形状内部。例如,为什么要绘制单个顶点,而不是可以存储并用于检查相交的多边形?通过谷歌搜索方法名称会返回结果Unity、OpenTK和其他图书馆的结果这不是关于事件或MouseEnter事件,而是关于mathYes,但我描述它是为了理解我以前在面对这个问题时所做的事情。你不使用系统绘制圆。也不绘制。你似乎在Unity中绘制多边形?使用适当的标记并解释你实际做了什么,以及问题是你会把人搞糊涂OK!更改了标签。不,是OpenTkyu,你仍然没有提到你使用了什么库。其中一些库允许你检查一个形状是否与另一个相交,或者一个点是否在形状内部。为什么要画单个顶点,而不是可以存储并用于检查相交的多边形?谷歌搜索方法名称会返回Unity、OpenTK和其他库的结果。这就是为什么这个问题超出范围的原因,实际上数学相关论坛已经回答了这个问题,但它可能并不关心什么是签入软件程序的最合适方式。这个答案并没有说明如何在程序中执行此操作。实际上,它确实提到了Math、 有一个有效的表达式,在表达式的两边使用平方项来避免Sqrt,也避免调用数学人可能建议的Sqr风格的自定义函数。请阅读数学人的回答。很抱歉,我的回答更适合C的程序员,这就是为什么这个问题超出了范围,已经回答了事实上,数学相关论坛可能并不关心什么是签入软件程序的最合适方式。这个答案并没有说明如何在程序中执行此操作。实际上,它确实提到了math.Abs,并且有一个有效的表达式,在表达式的两侧使用平方项以避免Sqrt,也避免调用Sqr样式的custom函数是数学人可能会建议的。请阅读你提到的数学人的答案。很抱歉,我的答案更适合C程序员#
public void DrawCicrle()
        {
            GL.Begin(PrimitiveType.TriangleFan);
            GL.Color4(Color_);
            GL.Vertex2(X_, Y_);
            for (int i = 0; i < 360; i++)
            {
                GL.Vertex2(X_ + Math.Cos(i) * Radius_, Y_ + Math.Sin(i) * Radius_);

            }
            GL.End();

        }
public Point CursorLocation
        {
            get
            {
                return CursorLocation_;
            }
            set
            {
                this.CursorLocation_ = value;
                for (int i = 0; i < 360; i++)
                {
                    if (CursorLocation_.X <= X_ + Math.Cos(i) * Radius_ && CursorLocation_.Y<= Y_ + Math.Sin(i) * Radius_ && CursorLocation_.Y>=Y_-Radius_)
                    {
                        Enter(new Point(CursorLocation_.X, CursorLocation_.Y));
                        break;
                    }
                }
            }
        }