commit
53bc81b989
|
|
@ -0,0 +1,5 @@
|
|||
cadlib
|
||||
bin
|
||||
MathNet.Numerics.4.15.0
|
||||
obj
|
||||
Properties
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using TransmissionGraphic.Graphic;
|
||||
using TransmissionGraphic.Type3D;
|
||||
|
||||
namespace TransmissionGraphic
|
||||
{
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
Canvas canvas = new Canvas();
|
||||
canvas.init_canvas();
|
||||
Line line = new Line(canvas,new TGVector3D(10, 20, 10), new TGVector3D(400, 25, 35), 0.32e-3, 400);
|
||||
canvas.draw(line.curve());
|
||||
canvas.save("abc.dxf");
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{9A62FBFE-70BE-4CAD-A0D5-402024C8FB26}</ProjectGuid>
|
||||
<OutputType>Exe</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>TransmissionGraphic</RootNamespace>
|
||||
<AssemblyName>TransmissionGraphic</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<TargetFrameworkProfile>
|
||||
</TargetFrameworkProfile>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="MathNet.Numerics">
|
||||
<HintPath>MathNet.Numerics.4.15.0\lib\net40\MathNet.Numerics.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="WW">
|
||||
<HintPath>cadlib\WW.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="WW.Cad">
|
||||
<HintPath>cadlib\WW.Cad.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="src\Graphic\Canvas.cs" />
|
||||
<Compile Include="src\Graphic\Line.cs" />
|
||||
<Compile Include="src\Transformation\Rotation.cs" />
|
||||
<Compile Include="src\Transformation\Transformation.cs" />
|
||||
<Compile Include="src\Type3D\Vector3D.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<?xml version="1.0"?>
|
||||
<configuration>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using WW.Cad.Model;
|
||||
using WW.Cad.Model.Entities;
|
||||
using WW.Cad.IO;
|
||||
using MathNet.Numerics.LinearAlgebra;
|
||||
|
||||
namespace TransmissionGraphic.Graphic
|
||||
{
|
||||
class Canvas
|
||||
{
|
||||
private DxfModel _model;
|
||||
public Canvas()
|
||||
{
|
||||
this._model = null;
|
||||
}
|
||||
|
||||
public void init_canvas()
|
||||
{
|
||||
DxfModel model = new DxfModel(DxfVersion.Dxf13);
|
||||
this._model = model;
|
||||
}
|
||||
|
||||
public void draw(Matrix<double> points)
|
||||
{
|
||||
DxfModel model=this._model;
|
||||
DxfPolyline3D polyline = new DxfPolyline3D();
|
||||
DxfVertex3D[] vertex = new DxfVertex3D[points.RowCount];
|
||||
for (int foo = 0; foo < points.RowCount; foo++)
|
||||
{
|
||||
vertex[foo] = new DxfVertex3D(points.At(foo, 0), points.At(foo, 1), points.At(foo, 2));
|
||||
}
|
||||
polyline.Closed = false;
|
||||
polyline.Vertices.AddRange(vertex);
|
||||
model.Entities.Add(polyline);
|
||||
}
|
||||
|
||||
public void save(string filePath)
|
||||
{
|
||||
DxfModel model = this._model;
|
||||
DxfWriter.Write(filePath, model);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using TransmissionGraphic.Type3D;
|
||||
using MathNet.Numerics.LinearAlgebra;
|
||||
using TransmissionGraphic.Transformation;
|
||||
using MathNet.Numerics;
|
||||
|
||||
namespace TransmissionGraphic.Graphic
|
||||
{
|
||||
class Line
|
||||
{
|
||||
private TGVector3D _start_p;
|
||||
private TGVector3D _end_p;
|
||||
private double _tension_k;
|
||||
private int _n_point;
|
||||
private double _span;
|
||||
private Matrix<double> _points;
|
||||
private Rotation _rotation;
|
||||
private Canvas _canvas;
|
||||
public Line(Canvas canvas, TGVector3D start_p, TGVector3D end_p, double tension_k, int n_point)
|
||||
{
|
||||
this._start_p = start_p;
|
||||
this._end_p = end_p;
|
||||
this._tension_k = tension_k;
|
||||
this._n_point = n_point;
|
||||
this._span = 0;
|
||||
this._points = null;
|
||||
this._rotation = null;
|
||||
this._canvas = canvas;
|
||||
|
||||
}
|
||||
|
||||
public Matrix<double> curve(bool draw = false)
|
||||
{
|
||||
if (this._points != null)
|
||||
{
|
||||
return this._points;
|
||||
}
|
||||
TGVector3D start_p = this._start_p;
|
||||
TGVector3D end_p = this._end_p;
|
||||
double tension_k = this._tension_k;
|
||||
int n_point = this._n_point;
|
||||
// 右手坐标系,Z朝上
|
||||
TGVector3D line = new TGVector3D(end_p.x, end_p.y, end_p.z) - new TGVector3D(start_p.x, start_p.y, start_p.z);
|
||||
// 计算与X轴的角度
|
||||
TGVector3D xy_project = new TGVector3D(line.x, line.y, line.z); // 投影到xy平面上
|
||||
xy_project.z = 0;
|
||||
double x_abs_angel = xy_project.angle_to(new TGVector3D(1, 0, 0));
|
||||
double x_angel = x_abs_angel * Math.Sign(xy_project.y);
|
||||
double height = end_p.z - start_p.z;
|
||||
double span = xy_project.abs();
|
||||
this._span = span;
|
||||
Vector<double> span_l = Vector<double>.Build.DenseOfArray(Generate.LinearSpaced(n_point, 0, span)); // 档距
|
||||
Vector<double> z_points = start_p.z + span_l * height / span - span_l.PointwiseMultiply(span - span_l)* tension_k / Math.Cos(Math.Atan(height / span));
|
||||
double[,] p_points = new double[n_point, 3];
|
||||
for (int foo = 0; foo < n_point; foo++)
|
||||
{
|
||||
p_points[foo, 0] = span_l[foo] + start_p.x;
|
||||
p_points[foo, 1] = start_p.y;
|
||||
p_points[foo, 2] = z_points[foo];
|
||||
}
|
||||
// 绕Z轴旋转
|
||||
Rotation rotation = new Rotation(x_angel, new TGVector3D(start_p.x, start_p.y, start_p.z), new TGVector3D(start_p.x, start_p.y, start_p.z + 1));
|
||||
|
||||
this._rotation = rotation;
|
||||
Matrix<double> points = rotation.rotate(Matrix<double>.Build.DenseOfArray(p_points));
|
||||
return points;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using TransmissionGraphic.Type3D;
|
||||
using MathNet.Numerics.LinearAlgebra.Double;
|
||||
using MathNet.Numerics.LinearAlgebra;
|
||||
//using TransmissionGraphic.Transformation;
|
||||
namespace TransmissionGraphic.Transformation
|
||||
{
|
||||
class Rotation
|
||||
{
|
||||
private Matrix<double> _r_transform;
|
||||
public Rotation(double angel, TGVector3D axis_start, TGVector3D axis_end)
|
||||
{
|
||||
this._r_transform = Transformation.rotation_matrix(angel, axis_start, axis_end);
|
||||
}
|
||||
|
||||
public Matrix<double> rotate(Matrix<double> point)
|
||||
{
|
||||
Matrix<double> r_transform = this._r_transform;
|
||||
Matrix<double> onesMatrix=Matrix.Build.Dense(point.RowCount,1,1);
|
||||
Matrix<double> expand_point = point.Append(onesMatrix);
|
||||
Matrix<double> transformed_points = r_transform * expand_point.Transpose();
|
||||
return Matrix.Build.DenseOfRows(transformed_points.EnumerateRows(0, transformed_points.RowCount-1)).Transpose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using TransmissionGraphic.Type3D;
|
||||
using MathNet.Numerics.LinearAlgebra;
|
||||
namespace TransmissionGraphic.Transformation
|
||||
{
|
||||
class Transformation
|
||||
{
|
||||
public static Matrix<double> create_rx(TGVector3D unit_axis)
|
||||
{
|
||||
double a = unit_axis.x;
|
||||
double b = unit_axis.y;
|
||||
double c = unit_axis.z;
|
||||
double d = Math.Pow((b * b + c * c), 0.5);
|
||||
Matrix<double> m = Matrix<double>.Build.DenseOfArray(new double[,]{
|
||||
{1, 0, 0, 0},
|
||||
{0, c / d, -b / d, 0},
|
||||
{0, b / d, c / d, 0},
|
||||
{0, 0, 0, 1}
|
||||
});
|
||||
return m;
|
||||
}
|
||||
|
||||
public static Matrix<double> create_ry(TGVector3D unit_axis)
|
||||
{
|
||||
double a = unit_axis.x;
|
||||
double b = unit_axis.y;
|
||||
double c = unit_axis.z;
|
||||
double d = Math.Pow((b * b + c * c), 0.5);
|
||||
Matrix<double> m = Matrix<double>.Build.DenseOfArray(new double[,]{
|
||||
{d, 0, -a, 0},
|
||||
{0, 1, 0, 0},
|
||||
{a, 0, d, 0},
|
||||
{0, 0, 0, 1}
|
||||
});
|
||||
return m;
|
||||
}
|
||||
|
||||
|
||||
public static Matrix<double> create_rz(double angel)
|
||||
{
|
||||
Matrix<double> m = Matrix<double>.Build.DenseOfArray(new double[,]{
|
||||
{Math.Cos(angel), -Math.Sin(angel), 0, 0},
|
||||
{Math.Sin(angel), Math.Cos(angel), 0, 0},
|
||||
{0, 0, 1, 0},
|
||||
{0, 0, 0, 1}
|
||||
});
|
||||
return m;
|
||||
}
|
||||
|
||||
public static Matrix<double> create_t(TGVector3D axis)
|
||||
{
|
||||
double x1, y1, z1;
|
||||
x1 = axis.x;
|
||||
y1 = axis.y;
|
||||
z1 = axis.z;
|
||||
Matrix<double> m = Matrix<double>.Build.DenseOfArray(new double[,]{
|
||||
{1, 0, 0, -x1},
|
||||
{0, 1, 0, -y1},
|
||||
{0, 0, 1, -z1},
|
||||
{0, 0, 0, 1}
|
||||
});
|
||||
return m;
|
||||
}
|
||||
|
||||
|
||||
public static Matrix<double> rotation_matrix(double angel, TGVector3D axis_start, TGVector3D axis_end)
|
||||
{
|
||||
TGVector3D axis = axis_end - axis_start;
|
||||
TGVector3D unit_axis = axis / axis.abs();
|
||||
Matrix<double> rz = create_rz(angel);
|
||||
Matrix<double> rx = create_rx(unit_axis);
|
||||
Matrix<double> ry = create_ry(unit_axis);
|
||||
Matrix<double> t = create_t(axis_start);
|
||||
Matrix<double> t_i = t.Inverse() ;
|
||||
Matrix<double> rx_i = rx.Inverse() ;
|
||||
Matrix<double> ry_i = ry.Inverse() ;
|
||||
Matrix<double> r_transform = t_i * rx_i * ry_i * rz * ry * rx * t;
|
||||
return r_transform;
|
||||
}
|
||||
|
||||
public static Matrix<double> rotation(double angel, TGVector3D axis_start, TGVector3D axis_end, Matrix<double> points)
|
||||
{
|
||||
|
||||
Rotation _rotation = new Rotation(angel, axis_start, axis_end);
|
||||
return _rotation.rotate(points);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace TransmissionGraphic.Type3D
|
||||
{
|
||||
public class TGVector3D
|
||||
{
|
||||
public double x;
|
||||
public double y;
|
||||
public double z;
|
||||
public TGVector3D(double x, double y, double z)
|
||||
{
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
}
|
||||
|
||||
|
||||
public static TGVector3D operator- (TGVector3D me, TGVector3D other)
|
||||
{
|
||||
return new TGVector3D(me.x - other.x, me.y - other.y, me.z - other.z);
|
||||
}
|
||||
|
||||
public static TGVector3D operator /(TGVector3D me, double other)
|
||||
{
|
||||
return new TGVector3D(me.x / other, me.y / other, me.z / other);
|
||||
}
|
||||
|
||||
|
||||
public double abs()
|
||||
{
|
||||
return Math.Pow((this.x *this.x + this.y*this.y + this.z*this.z),.5);
|
||||
}
|
||||
|
||||
|
||||
// 计算两向量间夹角
|
||||
public double angle_to(TGVector3D other)
|
||||
{
|
||||
return Math.Acos(
|
||||
Math.Abs(this.x * other.x + this.y * other.y + this.z * other.z) / this.abs() / other.abs()
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue