在C#中创建有机形状 - WPF

时间:2016-06-24 13:33:21

标签: c# wpf graphics 2d

在图形编程方面我是一个很新的东西,特别是在C#中,这就是为什么我决定尝试一个教我一两件图形编程的项目的原因。

(所有的过程都指2D)我想知道C#或WPF是否有任何创建有机形状的方法。有机形状我指的是没有硬角的形状,例如椭圆形。虽然我不想限制在省略号上。也许它有一个更好的名字,但我希望能够绘制blob(而且我不会说sql ba-dum-tsss ...

如果有人可以以任何方式提供帮助,那么无论是建议使用原生C#/ WPF解决方案还是某种类型的nuget / Library我都应该看看。

编辑Geoff James的礼貌:我的意思(视觉上)"有机形状"更类似于this

接下来我需要帮助,如果你还和我在一起,那就完全相反了。

我希望能够创建不规则的线条。不同厚度的线(优选在整个线的跨度内变化的厚度)和不稳定的结构。比如,如果你试图在移动的车辆中画一条线,当你的车撞到路面上的颠簸和其他不规则处时,你的手臂会跳到这个地方。

我认为这第二部分更简单一些。我看起来像是stroke constructor,我确实认为创建一个自然看起来不稳定的算法的算法并不太难,但是,我对于厚度画了一个空白。也许墨水命名空间有更多我需要的东西。

如果你还和我在一起,感谢你阅读这本小说并提供帮助,非常感谢!

1 个答案:

答案 0 :(得分:2)

Shape是一种UIElement,可以让您在屏幕上绘制形状。因为它们是UI元素,所以可以在Panel元素和大多数控件中使用Shape对象。

WPF提供了对图形和渲染服务的多层访问。在顶层,Shape对象易于使用,并提供许多有用的功能,例如布局和参与WPF事件系统。

WPF提供了许多即用型Shape对象。所有形状对象都继承自Shape类。可用的形状对象包括椭圆,直线,路径,多边形,折线和矩形。

您可以使用Path生成贝塞尔曲线。

您可以使用两种类型的路径段来绘制Bézier曲线。这些是一种特殊类型的平滑曲线,使用固定的起点和终点以及一个或多个控制点(称为切点)进行数学计算。

切点确定曲线的路径。如果绘制具有单个切点的直线,则曲线起点和终点的行进方向将直接指向该点。随着控制点的增多,曲线变得更加复杂。

WPF可以使用一个或两个控制点渲染Bézier曲线。

要创建具有单个切点的Bézier曲线,可以将QuadraticBezierSegment添加到PathGeometry。与其他段一样,曲线从前一段的结束点开始,或者如果曲线是第一段,则从Path的起点开始。起点的坐标在Point1属性中设置,曲线的终点在Point2中保存。

<Window x:Class="BezierSegmentDemo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WPF Path Demo"
    Height="200" Width="250">
<Canvas>
    <Path Stroke="#C0000000" StrokeThickness="3">
        <Path.Data>
            <PathGeometry>
                <PathGeometry.Figures>
                    <PathFigure StartPoint="20,100" IsClosed="False">
                        <QuadraticBezierSegment Point1="80,150" Point2="200,20"/>
                    </PathFigure>
                </PathGeometry.Figures>
            </PathGeometry>
        </Path.Data>
    </Path>
    <Ellipse Canvas.Left="75" Canvas.Top="145" Fill="Blue" Height="10" Width="10" />
</Canvas>

要创建具有两个切点的曲线,可以包含BezierSegment元素。这些需要三个属性。 Point1和Point2定义控制点。 Point3确定了行尾的坐标。

<Canvas>
    <Path Stroke="#C0000000" StrokeThickness="3">
        <Path.Data>
            <PathGeometry>
                <PathGeometry.Figures>
                    <PathFigure StartPoint="20,20" IsClosed="False">
                        <BezierSegment Point1="70,130" Point2="220,20" Point3="180,160"/>
                    </PathFigure>
                </PathGeometry.Figures>
            </PathGeometry>
        </Path.Data>
    </Path>
    <Ellipse Canvas.Left="65" Canvas.Top="125" Fill="Blue" Height="10" Width="10" />
    <Ellipse Canvas.Left="215" Canvas.Top="15" Fill="Blue" Height="10" Width="10" />
</Canvas>

要生成具有不同厚度的线,您实际上可以创建两条或更多条线,其厚度足以在沿曲线的不同点处或多或少地重叠。想象一下,如果你略微改变第二条线的曲线,使两条线完全重叠一个位置,那么厚度只是一条线的厚度,但它们只是触摸另一条点,使厚度是行程宽度的两倍。

您还可以使用fill创建一个封闭的路径。