chenn
2025-03-28 9dba1b6adc0bbb4aa8cc531f4e6d822bf1a56be3
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace DPumpHydr.WinFrmUI.Volute.ViewModel
{
    public class OutflowParas
    {
        public OutflowParas()
        {
 
        }
        public OutflowParas(OutflowParas rhs)
        {
            this.ShapeStyle = rhs.ShapeStyle;
            this.LinkStyle = rhs.LinkStyle;
            this.Offset = rhs.Offset;
            this.Heigh = rhs.Heigh;
            this.Dia = rhs.Dia;
            this.Tangent_Top_Right = rhs.Tangent_Top_Right;
            this.Tangent_Btm_Right = rhs.Tangent_Btm_Right;
            this.Tangent_Top_Left = rhs.Tangent_Top_Left;
            this.Tangent_Btm_Left = rhs.Tangent_Btm_Left;
            this.H1 = rhs.H1;
            this.H2 = rhs.H2;
            this.R1 = rhs.R1;
            this.R2 = rhs.R2;
            this.Septalradius = rhs.Septalradius;
        }
        public ViewModel.eOutflowShapeStyle ShapeStyle { get; set; } = ViewModel.eOutflowShapeStyle.未知;
        public ViewModel.eOutflowLinkStyle LinkStyle { get; set; } = ViewModel.eOutflowLinkStyle.曲线;
        /// <summary>
        /// 中心距离 图片中的A
        /// </summary>
        public double Offset { get; set; } //图片中的A  = 0.0;
        /// <summary>
        /// 出口长度 图片中L
        /// </summary>
        public double Heigh { get; set; } //图片中的L = 420.0;
        /// <summary>
        /// 出口宽度 图片中的D4
        /// </summary>
        public double Dia { get; set; } //图片中的D4 = 80.0;
        /// <summary>
        /// 右上曲线缩放量 
        /// </summary>
        public double Tangent_Top_Right { get; set; } = 1.0; //切线缩放量 = m_dTopValue;
        /// <summary>
        /// 右下曲线缩放量
        /// </summary>
        public double Tangent_Btm_Right { get; set; } = 1.0; //切线缩放量 = m_dBtmValue;
        /// <summary>
        /// 左上曲线缩放量
        /// </summary>
        public double Tangent_Top_Left { get; set; } = 1.0; //切线缩放量 = m_dTopValue;
        /// <summary>
        /// 左下曲线缩放量
        /// </summary>
        public double Tangent_Btm_Left { get; set; } = 1.0; //切线缩放量 = m_dBtmValue;
        /// <summary>
        /// 圆弧链接时R1
        /// </summary>
        public double R1 { get; set; }//圆弧连接时的R1
        /// <summary>
        /// 圆弧链接时R2
        /// </summary>
        public double R2 { get; set; }//圆弧连接时的R2
        /// <summary>
        /// 出口与曲线或圆弧之间的高度 左
        /// </summary>
        public double H1 { get; set; } //图片中的H1  = 10;
        /// <summary>
        /// 出口与曲线或圆弧之间的高度 右
        /// </summary>
        public double H2 { get; set; } //图片中的H2 = 10;
        /// <summary>
        /// 割舌半径
        /// </summary>
        public double Septalradius { get; set; } //隔舌半径r
 
        public double CalR2(
             ViewModel.HdrBaseInfo hdrBaseInfo,
             ViewModel.GeomBaseInfo geomBaseInfo,
             ViewModel.SectionBundleInfo sectionBundleInfo)
        {
            double r2 = 0;
            double scale2 = ((this.Heigh / 100) >= (sectionBundleInfo.H[6] / 75)) ? (this.Heigh / 100) : (sectionBundleInfo.H[6] / 75);
            PointD pt02 = new PointD(300, 100);
            if (scale2 <= 0.05) scale2 = 0.05;
            if ((scale2 > 0.05) && (scale2 <= 0.1)) scale2 = 0.1;
            if ((scale2 > 0.1) && (scale2 <= 0.2)) scale2 = 0.2;
            if ((scale2 > 0.2) && (scale2 <= 0.25)) scale2 = 0.25;
            if ((scale2 > 0.25) && (scale2 <= 0.4)) scale2 = 0.4;
            if ((scale2 > 0.4) && (scale2 <= 0.5)) scale2 = 0.5;
            if ((scale2 > 0.5) && (scale2 <= 1.0)) scale2 = 1;
            if ((scale2 > 1.0) && (scale2 <= 1.5)) scale2 = 1.5;
            if ((scale2 > 1.5) && (scale2 <= 2.0)) scale2 = 2.0;
            if ((scale2 > 2.0) && (scale2 <= 2.5)) scale2 = 2.5;
            if ((scale2 > 2.5) && (scale2 <= 3)) scale2 = 3;
            if ((scale2 > 3) && (scale2 <= 4)) scale2 = 4;
            if ((scale2 > 4) && (scale2 <= 5)) scale2 = 5;
            if ((scale2 > 5) && (scale2 <= 6)) scale2 = 6;
            if ((scale2 > 6) && (scale2 <= 7)) scale2 = 7;
            if ((scale2 > 7) && (scale2 <= 8)) scale2 = 8;
            if ((scale2 > 8) && (scale2 <= 9)) scale2 = 9;
            if ((scale2 > 9) && (scale2 <= 10)) scale2 = 10;
            if ((scale2 > 10) && (scale2 <= 15)) scale2 = 15;
            if ((scale2 > 15) && (scale2 <= 20)) scale2 = 20;
            if ((scale2 > 20) && (scale2 <= 25)) scale2 = 25;
            if ((scale2 > 25) && (scale2 <= 30)) scale2 = 30;
            if ((scale2 > 35) && (scale2 <= 40)) scale2 = 40;
            PointD pth12 = GeometryHelper.AdsPolar(pt02, GeometryHelper.DegreesToRadians(90), this.Heigh / scale2);
            pth12 = GeometryHelper.AdsPolar(pth12, GeometryHelper.DegreesToRadians(0), this.Offset / scale2);
            PointD pth6 = GeometryHelper.AdsPolar(pt02, GeometryHelper.DegreesToRadians(-90), (geomBaseInfo.D3 / 2 + sectionBundleInfo.H[6]) / scale2);
            PointD pth7 = GeometryHelper.AdsPolar(pt02, GeometryHelper.DegreesToRadians(-45), (geomBaseInfo.D3 / 2 + sectionBundleInfo.H[7]) / scale2);
            PointD pth8 = GeometryHelper.AdsPolar(pt02, GeometryHelper.DegreesToRadians(0), (geomBaseInfo.D3 / 2 + sectionBundleInfo.H[8]) / scale2);
            PointD pt1 = GeometryHelper.AdsPolar(pth6, GeometryHelper.DegreesToRadians(0), 0);
            PointD pt2 = GeometryHelper.AdsPolar(pth7, GeometryHelper.DegreesToRadians(0), 0);
            PointD pt3 = GeometryHelper.AdsPolar(pth8, GeometryHelper.DegreesToRadians(0), 0);
            double a1 = 2 * (pt1.X - pt2.X);
            double b1 = 2 * (pt1.Y - pt2.Y);
            double c1 = pt1.X * pt1.X - pt2.X * pt2.X + pt1.Y * pt1.Y - pt2.Y * pt2.Y;
            double A1 = 2 * (pt3.X - pt2.X);
            double B1 = 2 * (pt3.Y - pt2.Y);
            double C1 = pt3.X * pt3.X - pt2.X * pt2.X + pt3.Y * pt3.Y - pt2.Y * pt2.Y;
 
            double ptc4_Y = (A1 * c1 - a1 * C1) / (A1 * b1 - a1 * B1);
            double ptc4_X = (c1 - b1 * ptc4_Y) / a1;
 
            double rr4 = Math.Sqrt((pt2.X - ptc4_X) * (pt2.X - ptc4_X) + (pt2.Y - ptc4_Y) * (pt2.Y - ptc4_Y));
 
            // 计算 R2
            pt1 = GeometryHelper.AdsPolar(pth12, GeometryHelper.DegreesToRadians(0), this.Dia / 2 / scale2);
            a1 = 2 * (rr4 + ptc4_X - pt1.X);
            b1 = (ptc4_Y - pt1.Y) * (ptc4_Y - pt1.Y) - rr4 * rr4 + (ptc4_X - pt1.X) * (ptc4_X - pt1.X);
            r2 = (b1 / a1) * scale2;
            r2 = Math.Round(r2, 2);
            return r2;
        }
    }
    public static class GeometryHelper
    {
        // 将角度从度转换为弧度
        public static double DegreesToRadians(double degrees)
        {
            return degrees * Math.PI / 180.0;
        }
 
        // 计算极坐标点
        public static PointD AdsPolar(PointD startPoint, double angleInRadians, double distance)
        {
            double newX = startPoint.X + distance * Math.Cos(angleInRadians);
            double newY = startPoint.Y + distance * Math.Sin(angleInRadians);
            return new PointD(newX, newY);
        }
    }
    public struct PointD
    {
        public double X { get; set; }
        public double Y { get; set; }
 
        public PointD(double x, double y)
        {
            X = x;
            Y = y;
        }
 
        public override string ToString()
        {
            return $"({X}, {Y})";
        }
    }
    public class OutflowParasCalcReponse
    {
        public bool IsSuccess { get; set; }
        public double SectArea9 { get; set; } //9 截面面积
        public double SectArea10 { get; set; } //10 截面面积
    }
}