Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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# 使用GPS坐标从圆中删除圆弧_C#_Asp.net_Math_Trigonometry - Fatal编程技术网

C# 使用GPS坐标从圆中删除圆弧

C# 使用GPS坐标从圆中删除圆弧,c#,asp.net,math,trigonometry,C#,Asp.net,Math,Trigonometry,如何从圆中删除圆弧坐标?我不能用纬度或经度来比较坐标 我有3个坐标要处理 A是起始坐标 B是停止坐标 C是中心坐标 C的半径为A或B的13英里,或圆的任何坐标 请注意,坐标可以是圆上的任何位置,也可以是任何顺序 假设圆弧产生θ角,那么y坐标的a和B差给出了底部三角形的长度。所以我们说A(x1,y1)和B(x2,y2) 2rsin(θ/2)=y1-y2 解这个,你会得到θ。所以弧是2πr(θ/360)。花了一整晚才得出这个结论 /// <summary> /// Dr

如何从圆中删除圆弧坐标?我不能用纬度或经度来比较坐标

我有3个坐标要处理

A是起始坐标

B是停止坐标

C是中心坐标

C的半径为A或B的13英里,或圆的任何坐标

请注意,坐标可以是圆上的任何位置,也可以是任何顺序


假设圆弧产生θ角,那么y坐标的a和B差给出了底部三角形的长度。所以我们说A(x1,y1)和B(x2,y2)

2rsin(θ/2)=y1-y2


解这个,你会得到θ。所以弧是2πr(θ/360)。

花了一整晚才得出这个结论

 /// <summary>
        /// Draw an arc with .Net code
        /// </summary>
        /// <param name="a">Start point</param>
        /// <param name="b">Stop oint</param>
        /// <param name="centerPoint">Center point</param>
        /// <param name="nauticalMiles"></param>
        /// <returns></returns>
        public static string ExactArtGpsCoordinate(TfrXY a, TfrXY b, TfrXY centerPoint, decimal nauticalMiles)
        {
            //Notice database store longitude then latitude
            StringBuilder coordinates = new StringBuilder();
            DbGeography point = DbGeography.PointFromText(string.Format("POINT ({0} {1})", centerPoint.LngX, centerPoint.LatY), DbGeography.DefaultCoordinateSystemId);
            // create a circle around a point, convert from Nautical Miles to Kilometers
            var radius = UniversalWeather.Weather.API.Utility.MetricConversions.MetricConversions.NauticalMilesToMeters(nauticalMiles);
            DbGeography orig = point.Buffer(Convert.ToDouble(radius));
            string resultData = orig.AsText();

            //Clean data
            resultData = resultData.Replace("POLYGON ((", "");
            resultData = resultData.Replace(", ", ",0\n");
            resultData = resultData.Replace("))", ",0");
            resultData = resultData.Replace(" ", ",");

            //Convert the circular coordinate into array
            string[] splitCoordinates = resultData.Split('\n');
            bool IsEastToWest = false;
            #region Determinte direction
            if (a.LngX > b.LngX)
            {
                IsEastToWest = true;
            }
            #endregion

            //Add stop point
            coordinates.Append(b.LngX.ToString() + "," + b.LatY.ToString() + ",0\n");

            //Help to split the calculation for the arc
            double middleX = (a.LngX + b.LngX) / 2f;
            double middleY = (a.LatY + b.LatY) / 2f;

            for (int i = 0; i < splitCoordinates.Length; i++)
            {
                //split data to long then lat
                string[] temp = splitCoordinates[i].Split(',');
                //Current longitude
                double cx = Convert.ToDouble(temp[0]);
                double cy = Convert.ToDouble(temp[1]);

                #region Logic for East to West
                if (IsEastToWest)
                {
                    ////Half East
                    if (a.LatY > cy && middleX <= cx)
                    {
                        coordinates.Append(splitCoordinates[i] + "\n");
                    }
                    //Half West
                    else if (middleX >= cx && b.LatY >= cy)
                    {
                        coordinates.Append(splitCoordinates[i] + "\n");
                    }
                }
                #endregion
                #region Logic for West to EAST
                else
                {
                    //Half West
                    if (a.LatY < cy && middleX >= cx)
                    {
                        coordinates.Append(splitCoordinates[i] + "\n");
                    }
                    //Half East
                    else if (middleX <= cx && cx < b.LngX && cy > centerPoint.LatY)
                    {
                        coordinates.Append(splitCoordinates[i] + "\n");
                    }
                } 
                #endregion
            }
            //Add start point
             coordinates.Append(a.LngX.ToString() + "," + a.LatY.ToString() + ",0\n");
            return coordinates.ToString();
        }
//
///使用.Net代码绘制圆弧
/// 
///起点
///停止点
///中心点
/// 
/// 
公共静态字符串ExactArtGpsCoordinate(TfrXY a、TfrXY b、TfrXY中心点、十进制数字文件)
{
//注意数据库存储经度,然后是纬度
StringBuilder坐标=新的StringBuilder();
DbGeography point=DbGeography.PointFromText(string.Format(“point({0}{1})”,centerPoint.LngX,centerPoint.LatY),DbGeography.defaultCoordinationSystemId);
//围绕点创建一个圆,从海里转换为公里
var radius=UniversalWeather.Weather.API.Utility.MetricConversions.MetricConversions.NauticalMilesToMeters(nauticalMiles);
DbGeography orig=point.Buffer(Convert.ToDouble(radius));
字符串resultData=orig.AsText();
//干净数据
resultData=resultData.Replace(“多边形(“,”);
resultData=resultData.Replace(“,”,“,0\n”);
resultData=resultData.Replace(“)”,“,0”);
resultData=resultData.Replace(“,”,”);
//将圆坐标转换为数组
string[]splitCoordinates=resultData.Split('\n');
bool IsEastToWest=假;
#区域决定方向
如果(a.LngX>b.LngX)
{
IseastOwest=正确;
}
#端区
//添加停止点
coordinates.Append(b.LngX.ToString()+”,“+b.LatY.ToString()+”,0\n”);
//帮助分割圆弧的计算
双中间=(a.LngX+b.LngX)/2f;
双中间层=(a.LatY+b.LatY)/2f;
对于(int i=0;icy&&middleX=cx&&b.LatY>=cy)
{
coordinates.Append(拆分坐标[i]+“\n”);
}
}
#端区
#西向东的区域逻辑
其他的
{
//半西方
如果(a.LatY=cx)
{
coordinates.Append(拆分坐标[i]+“\n”);
}
//半东
否则,如果(中轴中心点板条)
{
coordinates.Append(拆分坐标[i]+“\n”);
}
} 
#端区
}
//添加起点
坐标.Append(a.LngX.ToString()+”,“+a.LatY.ToString()+”,0\n”);
返回坐标.ToString();
}

弧坐标是指要查找并删除圆边界上显示的所有坐标吗?