Мне нужно создать эту форму в WPF. Во-первых, я думал, что это путь, но линии внутри шоу - это трехмерная форма.Как нарисовать этот путь в WPF?
Как я могу нарисовать эту фигуру, включая линии?
Большое спасибо.
Мне нужно создать эту форму в WPF. Во-первых, я думал, что это путь, но линии внутри шоу - это трехмерная форма.Как нарисовать этот путь в WPF?
Как я могу нарисовать эту фигуру, включая линии?
Большое спасибо.
Наружный/контур фигуры можно сделать довольно просто с пути и объектов Ellipse. Верхнюю грань цилиндра можно также нарисовать с помощью ряда линий (как объектов Path) в сетке. Вы можете просто нарисовать их, чтобы все они выходили за верхний эллипс и использовали верхний эллипс в качестве маски для их обрезки.
Вертикальные линии в корпусе цилиндра немного сложнее. Их координаты можно определить по следующей формуле, предполагая, что левый край цилиндра в точке х = 0 и точка, в которой левый край цилиндра встречает левый край эллипса у = 0:
For i = 0 to NumberOfDivisions
HorizontalPosition = CircleRadius - (cos(pi/NumberOfDivisions * i) * CircleRadius)
TopOfLine = sin(pi/NumberOfDivisions * i) * CircleRadius * 0.5 //The 0.5 assumes that the ellipse will only be half as tall as it is wide.
BottomOfLine = TopOfLine + HeightOfCylinder
//draw vertical line where:
//X1=HorizontalPosition, Y1=TopOfLine
//X2=HorizontalPosition, Y2=BottomOfLine
Next
, где NumberOfDivisions + 1
равно количеству строк, которые вы хотите отобразить на цилиндре.
В MSDN есть несколько хороших примеров для начала работы с Path class.
Если все, что вам нужно, это просто способ представления 3D вид цилиндра, без сетки, линейной кисти градиента и 2 объектов пути будет делать трюк:
<Canvas >
<Path Width="111" Height="113.5" Canvas.Left="0" Canvas.Top="12.5" Stretch="Fill" StrokeLineJoin="Round" Stroke="#FF000000" Data="F1 M 177,190C 176.999,196.903 152.375,202.5 122,202.5C 91.6246,202.5 67.0006,196.903 67,189.979L 67,90L 177,90L 177,190 Z ">
<Path.Fill>
<LinearGradientBrush StartPoint="-0.00454615,0.5" EndPoint="1.00455,0.5">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#FF28A528" Offset="0"/>
<GradientStop Color="#FF63B963" Offset="0.152943"/>
<GradientStop Color="#FF9FCE9F" Offset="0.362069"/>
<GradientStop Color="#FF006C00" Offset="0.991379"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Path.Fill>
</Path>
<Path Width="111" Height="26" Canvas.Left="0" Canvas.Top="0" Stretch="Fill" StrokeLineJoin="Round" Stroke="#FF000000" Fill="#FF2CF72C" Data="F1 M 122,77.4999C 152.376,77.4999 177,83.0964 177,89.9999C 177,96.9035 152.376,102.5 122,102.5C 91.6244,102.5 67.0001,96.9035 67.0001,89.9999C 67.0001,83.0964 91.6245,77.4999 122,77.4999 Z "/>
</Canvas>
EDIT Хорошо, эти вопросы заинтриговали меня настолько, что я столкнулся с проблемой написания полной статьи для него на CodePoject, а также с исходным кодом простого проекта для рисования решения. Как правило, я бы не стал так много беспокоиться, но это был хороший простой проект для начала изучения C#.
Я не думаю, что это тот результат, который он хочет, но +1, потому что это классный пример. =) – CodingGorilla
... очень классный пример. +1 от меня тоже :) –
Вам нужно сделать это как 3d-объект или рисовать только как 2d-изображение, например, на холсте? –
Я точно не знаю, как это сделать, но посмотрите http://msdn.microsoft.com/en-us/library/ms747437.aspx, которые могут быть полезны – NominSim
@andronz Draw in 2D –