2012-01-26 2 views
5

Мне нужно создать эту форму в WPF. Во-первых, я думал, что это путь, но линии внутри шоу - это трехмерная форма.Как нарисовать этот путь в WPF?

Как я могу нарисовать эту фигуру, включая линии?

Большое спасибо.

enter image description here

+0

Вам нужно сделать это как 3d-объект или рисовать только как 2d-изображение, например, на холсте? –

+0

Я точно не знаю, как это сделать, но посмотрите http://msdn.microsoft.com/en-us/library/ms747437.aspx, которые могут быть полезны – NominSim

+0

@andronz Draw in 2D –

ответ

11

Наружный/контур фигуры можно сделать довольно просто с пути и объектов 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> 

enter image description here

EDIT Хорошо, эти вопросы заинтриговали меня настолько, что я столкнулся с проблемой написания полной статьи для него на CodePoject, а также с исходным кодом простого проекта для рисования решения. Как правило, я бы не стал так много беспокоиться, но это был хороший простой проект для начала изучения C#.

+0

Я не думаю, что это тот результат, который он хочет, но +1, потому что это классный пример. =) – CodingGorilla

+0

... очень классный пример. +1 от меня тоже :) –

Смежные вопросы