C# 两线相交,绘制圆

发布于:2024-10-13 ⋅ 阅读:(120) ⋅ 点赞:(0)

 private void drawChangeLineRadian(List<PointLatLng> ps) {
            
            removeRadianCircles();
            
            List<double> degrees = new List<double>();
            if (ps.Count > 2)
            {

                for (int i = 1; i < ps.Count; ++i)
                {
                    PointLatLng curPoint = ps[i];
                    PointLatLng prevPoint = ps[i - 1];
                    double angle = mapUtil.calculateDirection(prevPoint, curPoint);

                    degrees.Add(angle);

                    if (degrees.Count > 1)
                    {
                        // 两条线的夹角
                        double degreeSubtract = degrees[i - 1] - degrees[i - 2];
                        double includeAngle = 0;
                        // 方位
                        double position = 0;
                        //  > 0
                        if (degreeSubtract > 0)
                        {
                            if (degreeSubtract < 180)
                            {
                                includeAngle = 180 - degreeSubtract;
                                position = (degrees[i - 1] + includeAngle / 2) % 360;

                            }
                            if (degreeSubtract > 180)
                            {
                                includeAngle = 180 - (360 - degreeSubtract);
                                position = (degrees[i - 1] - includeAngle / 2) % 360;
                            }
                        }

                        if (degreeSubtract < 0)
                        {
                            if (degreeSubtract < -180)
                            {
                                includeAngle = 180 - (360 - Math.Abs(degreeSubtract));
                                position = (degrees[i - 1] + includeAngle / 2) % 360;
                            }
                            if (degreeSubtract > -180)
                            {
                                includeAngle = 180 - Math.Abs(degreeSubtract);
                                position = ((degrees[i - 2] + 180) + includeAngle / 2) % 360;

                            }

                        }

                        double aHalfIncludeAngle = includeAngle / 2;

                        double distance = centralRadius / Math.Sin(aHalfIncludeAngle * Math.PI / 180);

                        // 切点距离
                        double tangency_distance = distance * Math.Sin(aHalfIncludeAngle * Math.PI/180);

                        // 找出对照点 为上一个点  prevPoint
                        // 计算上一个点的纬度周长
                        double latGrith = earthRadius * Math.Cos(prevPoint.Lat * Math.PI / 180) * Math.PI * 2;

                        // 东北方向 degreeAndLat 与纬度的夹角
                        if (position > 0 && position < 90)
                        {
                            double degreeAndLat = 90 - position;
                            double veritalDistance = distance * Math.Sin(degreeAndLat * Math.PI / 180);
                            double horizontalDistance = distance * Math.Cos(degreeAndLat * Math.PI / 180);
                            // 距离转 度数
                            double veritalDegree = veritalDistance / lngGrith * 360;
                            double horizontalDegree = horizontalDistance / latGrith * 360;

                            double lat = prevPoint.Lat + veritalDegree;
                            double lng = prevPoint.Lng + horizontalDegree;

                            PointLatLng latLng = new PointLatLng(lat, lng);
                            GMapMarker hoverCircle = new GMapMarker(latLng);
                            Circle c = new Circle(hoverCircle, 100, MainMap);
                            c.SetColor(Brushes.Yellow, 3);
                            hoverCircle.Shape = c;
                            MainMap.Markers.Add(hoverCircle);
                            radianCircles.Add(hoverCircle);
                        }
                        // 东南方向
                        else if (position > 90 && position < 180)
                        {
                            double degreeAndLat = position - 90;

                            double veritalDistance = distance * Math.Sin(degreeAndLat * Math.PI / 180);
                            double horizontalDistance = distance * Math.Cos(degreeAndLat * Math.PI / 180);
                            // 距离转 度数
                            double veritalDegree = veritalDistance / lngGrith * 360;
                            double horizontalDegree = horizontalDistance / latGrith * 360;

                            // 中心点
                            double lat = prevPoint.Lat - veritalDegree;
                            double lng = prevPoint.Lng + horizontalDegree;
                            // 两个切点
                            


                            

                            PointLatLng latLng = new PointLatLng(lat, lng);
                            GMapMarker hoverCircle = new GMapMarker(latLng);

                            

                            Circle c = new Circle(hoverCircle, 100, MainMap);
                            c.SetColor(Brushes.Yellow, 3);
                            hoverCircle.Shape = c;
                            MainMap.Markers.Add(hoverCircle);
                            radianCircles.Add(hoverCircle);

                        }
                        // 西南方向
                        else if (position > 180 && position < 270)
                        {
                            double degreeAndLat = 270 - position;
                            double veritalDistance = distance * Math.Sin(degreeAndLat * Math.PI / 180);
                            double horizontalDistance = distance * Math.Cos(degreeAndLat * Math.PI / 180);
                            // 距离转 度数
                            double veritalDegree = veritalDistance / lngGrith * 360;
                            double horizontalDegree = horizontalDistance / latGrith * 360;

                            double lat = prevPoint.Lat - veritalDegree;
                            double lng = prevPoint.Lng - horizontalDegree;

                            PointLatLng latLng = new PointLatLng(lat, lng);
                            GMapMarker hoverCircle = new GMapMarker(latLng);
                            Circle c = new Circle(hoverCircle, 100, MainMap);
                            c.SetColor(Brushes.Yellow, 3);
                            hoverCircle.Shape = c;
                            MainMap.Markers.Add(hoverCircle);
                            radianCircles.Add(hoverCircle);
                        }
                        // 西北方向
                        else if (position > 270 && position < 360)
                        {
                            double degreeAndLat = position - 270;
                            double veritalDistance = distance * Math.Sin(degreeAndLat * Math.PI / 180);
                            double horizontalDistance = distance * Math.Cos(degreeAndLat * Math.PI / 180);
                            // 距离转 度数
                            double veritalDegree = veritalDistance / lngGrith * 360;
                            double horizontalDegree = horizontalDistance / latGrith * 360;

                            double lat = prevPoint.Lat + veritalDegree;
                            double lng = prevPoint.Lng - horizontalDegree;

                            PointLatLng latLng = new PointLatLng(lat, lng);
                            GMapMarker hoverCircle = new GMapMarker(latLng);
                            Circle c = new Circle(hoverCircle, 100, MainMap);
                            c.SetColor(Brushes.Yellow, 3);
                            hoverCircle.Shape = c;
                            MainMap.Markers.Add(hoverCircle);
                            radianCircles.Add(hoverCircle);
                        }


                    }

                }


            }

        }


网站公告

今日签到

点亮在社区的每一天
去签到