⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 module.cs

📁 苏金明编写的《用VB.NET和VC#.NET开发交互式CAD系统》一书的源代码
💻 CS
字号:
using System;
using System.Drawing;

namespace 拾取
{
	/// <summary>
	/// Module 的摘要说明。
	/// </summary>
	public class Module
	{
		public Module()
		{
			//
			// TODO: 在此处添加构造函数逻辑
			//
		}
		public float[] LineLine(CLine line1, CLine line2)
		{
			float[] reValue={0,0,0};
			float xx1,yy1,xx2,yy2;
			float x1,y1,x2,y2;
			float n1,n3,n4;
			float n2=0;

			if (line1.LBegin.X > line1.LEnd.X)
			{
				xx2 =line1.LBegin.X;
				yy2 =line1.LBegin.Y;
				xx1 =line1.LEnd.X;
				yy1 =line1.LEnd.Y;
			}
			else
			{
				xx1 = line1.LBegin.X;
				yy1 = line1.LBegin.Y;
				xx2 = line1.LEnd.X;
				yy2 = line1.LEnd.Y;
			}

			if (line2.LBegin.X > line2.LEnd.X)
			{
				x2 = line2.LBegin.X;
				y2 = line2.LBegin.Y;
				x1 = line2.LEnd.X;
				y1 = line2.LEnd.Y;
			}
			else
			{
				x1 = line2.LBegin.X;
				y1 = line2.LBegin.Y;
				x2 = line2.LEnd.X;
				y2 = line2.LEnd.Y;
			}

			float[] kc1= LineKX(new PointF(xx1, yy1), new PointF(xx2, yy2));
			float[] kc2= LineKX(new PointF(x1, y1), new PointF(x2, y2));

			//如果两条直线段的斜率相同
			if (kc1[0] == kc2[0])
			{
				if (x1 > xx2 || x2 < xx1)
				{
					reValue[0] = 0;
				}
				else
				{
					n1 = y1 + (-x1) * kc1[0];
					n1 = yy1 + (-xx1) * kc2[0];
					if (n1 != n2)
					{
						reValue[0] = 0;
					}
					else
					{
						n3 = Math.Max(xx1, x1);
						n4 = Math.Min(xx2, x2);
						reValue[1] = n3;
						reValue[2] = y1 + (n3 - x1) * kc1[0];
						if (n3 == n4){reValue[0] = 1;}
						reValue[3] = n4;
						reValue[4] = y1 + (n4 - x1) * kc1[0];
						reValue[0] = 2;
					}
				}
			}
			else
			{
				reValue[1] = (kc1[1] - kc2[1]) / (kc2[0] - kc1[0]);
				reValue[2] = kc1[1] + reValue[1] * kc1[0];
				//如果交点横坐标在两条直线段的横坐标范围内
				if ((reValue[1] >= x1 && reValue[1] <= x2 &&
					reValue[1] >= xx1 && reValue[1] <= xx2))
				{
					reValue[0] = 1;
				}
				else
				{
					reValue[0] = 0;
				}
			}

			return reValue;
		}

		//计算直线段的截距式方程
		public float[] LineKX(PointF pB,PointF pE)
		{
			float[] kc={0,0};
			//若直线段不为竖直线段
			if (pB.X != pE.X)
			{
				kc[0] = (pE.Y - pB.Y) / (pE.X - pB.X);
			}
				//如果是竖直线段
			else
			{
				kc[0] = 10000;
			}
			//计算截距
			kc[1] = pB.Y - kc[0] * pB.X;
			return kc;
		}

		//计算两点之间的距离
		public float DistPtoP(PointF p1, PointF p2)
		{
			return checked((float)(Math.Sqrt((p2.X - p1.X) * (p2.X - p1.X) + 
				(p2.Y - p1.Y) * (p2.Y - p1.Y))));
		}

		//圆的一般式方程
		private float[] CircleF(PointF pCenter,float r)
	    {
			float[] con = {0, 0, 0};
			con[0] = -2 * pCenter.X;
			con[1] = -2 * pCenter.Y;
			con[2] = pCenter.X * pCenter.X + pCenter.Y * pCenter.Y - r * r;
			return con;
		}

		//求直线段和圆的交点
		public float[] LineCircle(CLine line, CCircle circle)
		{
			float[] kc= {0, 0};
			float[] con= {0, 0, 0};
			float[] interxy= {0, 0, 0, 0, 0};
			float LineMinX;
			float LineMaxX,LineMinY,LineMaxY;
			float[] X={0,0};
			float[] Y={0,0};
			LineMinX = Math.Min(line.LBegin.X, line.LEnd.X);
			LineMaxX = Math.Max(line.LBegin.X, line.LEnd.X);
			LineMinY = Math.Min(line.LBegin.Y, line.LEnd.Y);
			LineMaxY = Math.Max(line.LBegin.Y, line.LEnd.Y);
			kc = LineKX(line.LBegin, line.LEnd);
			con = CircleF(circle.Center, circle.Radius);
			float A = 1 + kc[0] * kc[0];
			float B = 2 * kc[1] * kc[0] + con[1] * kc[0] + con[0];
			float C = kc[1] * kc[1] + con[1] * kc[1] + con[2];
			float Root= B * B - 4 * A * C;
			if (Root < 0)
			{
				interxy[0] = 0;
			}
			else if (Root == 0)
			{
				X[0] = -B / 2 / A;
				Y[0] = kc[0] * X[1] + kc[1];
				//如果直线不是竖直线
				if (line.LBegin.X != line.LEnd.X)
				{
					if (X[0] < LineMinX || X[0] > LineMaxX)
					{
						interxy[0] = 0;
					}
					else
					{
						interxy[0] = 1;
						interxy[1] = X[0];
						interxy[2] = Y[0];
					}
				}
				//如果直线是竖直线
				else
				{
					if (Y[0] < LineMinY || Y[0] > LineMaxY)
					{
						interxy[0] = 0;
					}
					else
					{
						interxy[0] = 1;
						interxy[1] = X[0];
						interxy[2] = Y[0];
					}
				}
			}
			else
			{
				X[0] = (-B + checked((float)(Math.Sqrt(Root)))) / 2 / A;
				X[1] = (-B - checked((float)(Math.Sqrt(Root)))) / 2 / A;
				Y[0] = kc[0] * X[0] + kc[1];
				Y[1] = kc[0] * X[1] + kc[1];
				//如果直线不是竖直线
				if (line.LBegin.X != line.LEnd.X)
				{
					if ((X[0] < LineMinX || X[0] > LineMaxX) && 
						(X[1] < LineMinX || X[1] > LineMaxX))
					{
						interxy[0] = 0;}
					else if ((X[0] < LineMinX || X[0] > LineMaxX) &&
						!(X[1] < LineMinX || X[1] > LineMaxX))
					{
						interxy[0] = 1;
						interxy[1] = X[1];
						interxy[2] = Y[1];
					}
					else if (!(X[0] < LineMinX || X[0] > LineMaxX) &&
						(X[1] < LineMinX || X[1] > LineMaxX))
					{
						interxy[0] = 1;
						interxy[1] = X[0];
						interxy[2] = Y[0];
					}
					else
					{
						interxy[0] = 2;
						interxy[1] = X[0];
						interxy[2] = Y[0];
						interxy[3] = X[1];
						interxy[4] = Y[1];
					}
				}
				//如果直线是竖直线
				else
				{
					if ((Y[0] < LineMinY || Y[0] > LineMaxY) &&
					    (Y[1] < LineMinY || Y[1] > LineMaxY))
					{
						interxy[0] = 0;}
					else if ((Y[0] < LineMinY || Y[0] > LineMaxY) &&
						!(Y[1] < LineMinY || Y[1] > LineMaxY))
					{
						interxy[0] = 1;
						interxy[1] = X[1];
						interxy[2] = Y[1];
					}
					else if (!(Y[0] < LineMinY || Y[0] > LineMaxY) &&
						(Y[1] < LineMinY || Y[1] > LineMaxY))
					{
						interxy[0] = 1;
						interxy[1] = X[0];
						interxy[2] = Y[0];
					}
					else
					{
						interxy[0] = 2;
						interxy[1] = X[0];
						interxy[2] = Y[0];
						interxy[3] = X[1];
						interxy[4] = Y[1];
					}
				}
			}
			return interxy;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -