рд╢реБрдн рд╕рдВрдзреНрдпрд╛, рд╣рдмрд░ред
рдпрд╣ рд▓реЗрдЦ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ, рдореИрдВ рд╡рд┐рдВрдбреЛрдЬ рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рди рдлрд╛рдЙрдВрдбреЗрд╢рди рдореЗрдВ рдХреНрд░рд╛рдВрддрд┐ рдХреЗ рд╕рд░рд▓ рдирд┐рдХрд╛рдпреЛрдВ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред OpenGL рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рдПрдХ рд╕реЗрдореЗрд╕реНрдЯрд░ рдХреЗ рдмрд╛рдж, рдпрд╛ glut.h рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ WPF рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдо рдмрд┐рддрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдПрдХ рдЯреЛрд░рд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗред
WPF рдореВрд▓ рдмрд╛рддреЗрдВ
WPF рдореЗрдВ рдореБрдЦреНрдп рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХ
рдореЗрд╖ рд╣реИ , рдореБрдЭреЗ рд░реВрд╕реА рдореЗрдВ рд╢рдмреНрдж рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдорд┐рд▓рд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рддреНрд░рд┐рдХреЛрдгреАрдп рдЦрдВрдб рдпрд╛ рд╕рд┐рд░реНрдл рдПрдХ рддреНрд░рд┐рдХреЛрдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ: рдПрдХ рддреНрд░рд┐рдХреЛрдг, рдПрдХ рд░реЗрдЦрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ?
рдорд╛рди рд▓реАрдЬрд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╕рддрд╣ рдХрд╛ рдПрдХ рдореВрд▓ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдПрдХ рд╡рд┐рдорд╛рдиред рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрдХреВрд▓ рдЬреНрдпрд╛рдорд┐рддрд┐ рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рд╡рд┐рдорд╛рди рдХрдо рд╕реЗ рдХрдо рддреАрди рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рддреНрд░рд┐рдХреЛрдгреЛрдВ рдХреА рд╕рддрд╣ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд╕рд┐рд▓реЗрдВрдбрд░ рд╕реЗ рдХрдИ рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХ рдирд┐рдХрд╛рд▓реЗред рдкреНрд░рддреНрдпреЗрдХ рддреНрд░рд┐рдХреЛрдгреАрдп рд╕реЗрдЧрдореЗрдВрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕рдХреЗ рдХреЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рд╕рд╛рдорд╛рдиреНрдпред рдХреЛрдиреЗ рдХреЛ рдХреНрд▓реЙрдХрд╡рд╛рдЗрдЬ рдпрд╛ рд╡рд╛рдорд╛рд╡рд░реНрдд рдХреЗ рд░реВрдк рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рддреНрд░рд┐рдХреЛрдг рдХреЗ рдХрд┐рди рд╡рд┐рдорд╛рдиреЛрдВ (рдЬрд┐рдирдореЗрдВ рд╕реЗ рджреЛ рд╣реИрдВ) рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рд╡рд╛рдВрдЫрд┐рдд рдХреНрд░рдо рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдмрд╕ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рджрд╛рд╣рд┐рдиреЗ рд╣рд╛рде рдХрд╛ рдирд┐рдпрдордЕрдкрдиреЗ рджрд╛рд╣рд┐рдиреЗ рд╣рд╛рде рдХреЗ рдЕрдВрдЧреВрдареЗ рдХреЛ рдЙрдард╛рдПрдВ, рдпрд╣ рдЙрд╕ рддрд░рдл рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред рдЕрдкрдиреА рдЙрдВрдЧрд▓реА рдХреЛ рдиреАрдЪреЗ рдХрд░реЗрдВ, рдЖрдк рд╡рд┐рдкрд░реАрдд рджреЗрдЦреЗрдВрдЧреЗ, рд╢реЗрд╖ рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдмрд╛рдИрдкрд╛рд╕ рдХреНрд░рдо рдХреЛ рджрд┐рдЦрд╛рдПрдЧреАред

рд╕рд╛рдорд╛рдиреНрдп рддреНрд░рд┐рднреБрдЬ рдХреЗ рд╕рдорддрд▓ рдХреЗ рд▓рд┐рдП рд▓рдВрдмрд╡рдд рдПрдХ рд╡реЗрдХреНрдЯрд░ рд╣реИ рдЬрд┐рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдПрдХ рддреНрд░рд┐рдХреЛрдг рдХреЗ рджреЛ рдкрдХреНрд╖реЛрдВ рдХрд╛ рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрд╛рдж рдиреЙрд░реНрдорд▓ рдХреЛ рдЙрд╕реА рдХреНрд░рдо рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдХреЛрдиреЗред
рдирддреАрдЬрддрди, рдкреНрд░рддреНрдпреЗрдХ рддреНрд░рд┐рдХреЛрдгреАрдп рдЦрдВрдб рдореЗрдВ рд╣реИ
- рдореЗрд╖ рд╕реНрдерд┐рддрд┐
- рддреНрд░рд┐рднреБрдЬ рдЗрдВрдбреЛрд▓ (рддреНрд░рд┐рднреБрдЬ рдкрд░ рддреАрди рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ)
- рддреНрд░рд┐рднреБрдЬ рдиреЙрд░реНрдорд▓
3 рдбреА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХреА рдЙрддреНрдкрддреНрддрд┐ 2 рдбреА рдХреЗ рд╡рд┐рдкрд░реАрдд, рджреГрд╢реНрдп рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд╣реИ, рдЬрд╣рд╛рдВ рдореВрд▓ рдКрдкрд░реА рдмрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ рд╣реИред рджреГрд╢реНрдп рдХреА рдЧреНрд░рд╛рдлрд┐рдХ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
Viewport3D рд╡рд░реНрдЧ

рдЪреВрдВрдХрд┐ рд╕реНрдХреНрд░реАрди рдкрд░ 3 рдбреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛ-рдЖрдпрд╛рдореА рдЕрдиреБрдорд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдЕрд╡рд▓реЛрдХрди рдмрд┐рдВрджреБ рдЪреБрдирдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧреАред WPF рдореЗрдВ, рдпрд╣ рдмрд┐рдВрджреБ рдХреНрд▓рд╛рд╕
рдХреИрдорд░рд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ
рдереЛрд░
рдЯреЛрд░рд╕ рдЙрд╕ рд╕рд░реНрдХрд▓ рдХреЗ рдкреНрд▓реЗрди рдореЗрдВ рдкрдбрд╝реА рдПрдХ рдзреБрд░реА рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд╕рд░реНрдХрд▓ рдХреЗ рдЬреЗрдирд░реЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдШреБрдорд╛рдХрд░ рдкреНрд░рд╛рдкреНрдд рдХреНрд░рд╛рдВрддрд┐ рдХреА рд╕рддрд╣ рд╣реИред

рдЯреЛрд░рд╕ рд╕рдореАрдХрд░рдгреЛрдВ рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдФрд░ рдмреАрдЬреАрдп рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ
рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХред
x = (R + r * cos (a)) * cos (b)
y = r * sin (a)
z = - (рдЖрд░ + рдЖрд░ * рдХреЙрд╕ (рдП) рдкрд╛рдк (рдмреА)рдЯреЛрд░рд╕ рд╕рдореАрдХрд░рдг рдХреЛ рдПрдирдХреЛрдб рдХрд░реЗрдВред
рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рджрд┐рдП рдЧрдП рддреНрд░рд┐рдЬреНрдпрд╛ рдФрд░ рдХреЛрдгреЛрдВ рдкрд░ рдПрдХ рдмрд┐рдВрджреБ рд▓реМрдЯрд╛рддреА рд╣реИ:
public Point3D getPositionTor(double R, double r, double a, double v){ double sinB = Math.Sin(B * Math.PI / 180); double cosB = Math.Cos(B * Math.PI / 180); double sinA = Math.Sin(A * Math.PI / 180); double cosA = Math.Cos(A * Math.PI / 180); Point3D point = new Point3D(); point.X = (R + r * cosA) * cosB; point.Y = r * sinA; point.Z = -(R + r * cosA) * sinB; return point; }
рддреНрд░рд┐рдХреЛрдгреАрдп рдЦрдВрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВ
public static void drawTriangle( Point3D p0, Point3D p1, Point3D p2, Color color, Viewport3D viewport) { MeshGeometry3D mesh = new MeshGeometry3D(); mesh.Positions.Add(p0); mesh.Positions.Add(p1); mesh.Positions.Add(p2); mesh.TriangleIndices.Add(0); mesh.TriangleIndices.Add(1); mesh.TriangleIndices.Add(2); SolidColorBrush brush = new SolidColorBrush(); brush.Color = color; Material material = new DiffuseMaterial(brush); GeometryModel3D geometry = new GeometryModel3D(mesh, material); ModelUIElement3D model = new ModelUIElement3D(); model.Model = geometry; viewport.Children.Add(model); }
рдЯрд╛рд░реНрдЪ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред
рд╣рдо рдКрдкрд░ рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рд╕реЗрдЧрдореЗрдВрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд╛рд░ рддреНрд░рд┐рдХреЛрдгреЛрдВ рдкрд░ рдирд┐рд░реНрдорд┐рдд рджреЛ рддреНрд░рд┐рдХреЛрдгреЛрдВ рдХрд╛ рдорд┐рд▓рди рд╣реИред
public void drawTor(Point3D center, double R, double r, int N, int n, Color color){ if (n < 2 || N < 2){ return; } Model3DGroup tor = new Model3DGroup(); Point3D[,] points = new Point3D[N, n]; for (int i = 0; i < N; i++){ for (int j = 0; j < n; j++){ points[i, j] = getPositionTor(R, r, i * 360/(N - 1), j * 360/(n - 1)); points[i, j] += (Vector3D)center; } } Point3D[] p = new Point3D[4]; for (int i = 0; i < N - 1; i++){ for (int j = 0; j < n - 1; j++){ p[0] = points[i, j]; p[1] = points[i + 1, j]; p[2] = points[i + 1, j + 1]; p[3] = points[i, j + 1]; drawTriangle(p[0], p[1], p[2], color, mainViewport); drawTriangle(p[2], p[3], p[0], color, mainViewport); } } }
рдпрд╣ рдЯреЛрд░рд╕ рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ
drawTor(new Point3D(0, 0, 0), 1.0, 0.3, 20, 15, Colors.Tomato, false);
рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ XAML рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЬрд▓реНрджреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореИрдВ рдХреЗрд╡рд▓ ViewPort3D рдЬреЛрдбрд╝реВрдВрдЧрд╛
<Viewport3D Name="mainViewport" ClipToBounds="True" Height="374"> <Viewport3D.Camera> <PerspectiveCamera FarPlaneDistance="100" LookDirection="-11,-10,-9" UpDirection="0,1,0" NearPlaneDistance="1" Position="11,10,9" FieldOfView="70"/> </Viewport3D.Camera> <ModelVisual3D> <ModelVisual3D.Content> <DirectionalLight Color="White" Direction="-2,-3,-1"/> </ModelVisual3D.Content> </ModelVisual3D> </Viewport3D>
рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ:

рдФрд░ рдХреБрдЫ рдЦрдВрдбреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред