duheng
2024-09-25 89d0f68df0ef91b88098912ddcbb54b3d7e2dd5c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
namespace Yw.WinFrmUI.Phart
{
    public static class Point2dListExtensions
    {
 
        /// <summary>
        ///  是否完全相同
        /// </summary> 
        public static bool IsEqualValueX(this List<Yw.Geometry.Point2d> pt_list, List<Yw.Geometry.Point2d> comparer_pt_list)
        {
            if (pt_list == null || pt_list.Count() == 0)
            {
                if (comparer_pt_list == null || comparer_pt_list.Count() == 0)
                {
                    return true;
                }
 
                return false;
            }
 
            if (comparer_pt_list == null || comparer_pt_list.Count() == 0)
            {
                if (pt_list == null || pt_list.Count() == 0)
                {
                    return true;
                }
 
                return false;
            }
 
            if (pt_list.Count != comparer_pt_list.Count)
            {
                return false;
            }
 
            for (int i = 0; i < pt_list.Count; i++)
            {
                if (Math.Abs(pt_list[i].X - comparer_pt_list[i].X) > 0.001)
                {
                    return false;
                }
            }
 
            return true;
        }
 
 
        /// <summary>
        /// 修改曲线0点位置的值,曲线值会根据比例逐渐变化,直到fixPtX,不再变化
        /// </summary> 
        public static List<Yw.Geometry.Point2d> AmendByZeroPointY(this List<Yw.Geometry.Point2d> pt_list, double fix_point_x, double zero_point_y)
        {
            if (pt_list == null || pt_list.Count < 3)
                return null;
 
            var fit_pt_list = new List<Yw.Geometry.Point2d>();
 
            //计算差距
            double zeroDis = pt_list.First().Y - zero_point_y;
            for (int i = 0; i < pt_list.Count; i++)
            {
                double dis = 0;
                if (pt_list[i].X <= fix_point_x)
                {
                    dis = zeroDis * (1 - pt_list[i].X / fix_point_x);
                }
                else
                {
                    dis = 0;
                }
 
                fit_pt_list.Add(new Yw.Geometry.Point2d(pt_list[i].X, pt_list[i].Y - dis));
            }
 
            var cubic_spline = new Yw.Geometry.CubicSpline2d(fit_pt_list);
            return cubic_spline.GetPointList(pt_list.Count);
        }
 
 
        /// <summary>
        /// 
        /// </summary> 
        public static List<Yw.Geometry.Point2d> GetFitPointList(this List<Yw.Geometry.Point2d> pt_list)
        {
            if (pt_list==null||!pt_list.Any())
                return default;
 
            var cubic_spline = new Yw.Geometry.CubicSpline2d(pt_list);
            return cubic_spline.GetPointList(pt_list.Count);
        }
 
        /// <summary>
        /// 
        /// </summary> 
        public static List<Yw.Geometry.Point2d> GetFitPointList(this List<Yw.Geometry.Point2d> pt_list, int point_count)
        {
            if (pt_list == null || !pt_list.Any())
                return default;
 
            var cubic_spline = new Yw.Geometry.CubicSpline2d(pt_list);
            return cubic_spline.GetPointList(point_count);
        }
 
    }
}