📄 module.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 + -