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

Creating organic shapes in C# - WPF

在图形化编程方面,我是个新手,尤其是在 C# 方面,这就是为什么我决定尝试一个可以教会我一两件有关图形化编程的项目的原因。

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

如果有人能以任何方式提供帮助,无论是建议本机 C#/WPF 解决方案还是某种 nuget/Library 我应该看看。

由 Geoff James 提供编辑:"organic shapes" 的意思(视觉上)更类似于 this

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

我想要创建不规则线条的功能。不同粗细的线条(最好是整个线条的粗细不同),以及摇摇欲坠的建筑。例如,如果您试图在行驶的车辆中画一条线,当汽车撞到道路上的颠簸和其他不规则处时,您的手臂到处乱跳。

我认为这第二部分要简单一些。我看过 stroke constructor,我确实相信创建一个自然摇晃的线条的算法不会太难,但是,我在厚度上画了一个空白。也许 ink 命名空间有更多我需要的东西。

如果你还在我身边,感谢你阅读这本小说并提供你的帮助,非常感谢!

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

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

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

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

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

切点决定了曲线的路径。如果您绘制一条具有单个切点的线,则曲线起点和终点的行进方向将直接指向该点。控制点越多,曲线越复杂

WPF 可以用一个或两个控制点渲染贝塞尔曲线。

要创建具有单个切点的贝塞尔曲线,您可以将 QuadraticBezierSegment 添加到 PathGeometry。与其他段一样,曲线从前一段的终点开始,如果曲线是第一段,则从路径的起点开始。起点坐标保存在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>

要获得一条粗细不同的线,您实际上可以创建两条或更多条线,其粗细足以在曲线上的不同点或多或少地重叠。想象一下,如果你稍微改变第二条线的曲线,使两条线完全重叠一个地方,那么粗细就是一条线的粗细,但它们只是在另一点接触,这样粗细就是笔划宽度的两倍。

您也可以创建一个带填充的闭合路径。