wpf 如何旋转(渲染)变换椭圆围绕一个点以外的椭圆本身?

ovfsdjhp  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(133)

我试图使一个定时器控件与一个“点”指标移动周围的一个圆圈(Link to image)。
如何确定围绕哪个点旋转指示器?(公式是什么?)
通过反复试验,我发现正确的点似乎是(10,202.5),但我看不到任何与画布和/或指示器的大小/位置/strokethickness相关的“模式”。

<UserControl
    x:Class="TestApp.Clock"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Name="clock"
    Width="512"
    Height="512"
    Background="White">
    <Canvas Width="512" Height="512">
        <Ellipse
            Canvas.Left="56"
            Canvas.Top="56"
            Width="400"
            Height="400"
            Opacity=".15"
            Stroke="Aqua"
            StrokeThickness="10" />
        <Ellipse
            Name="DotIndicator"
            Canvas.Left="248"
            Canvas.Top="52"
            Width="16"
            Height="16"
            Stroke="Aqua"
            StrokeThickness="10">
            <Ellipse.RenderTransform>
                <RotateTransform Angle="{Binding Angle, ElementName=clock}" CenterX="10" CenterY="202.5" />
            </Ellipse.RenderTransform>
        </Ellipse>
    </Canvas>
</UserControl>

字符串

8i9zcol2

8i9zcol21#

最好将两个Path元素与具有公共坐标原点的EllipseGeometries一起使用。“指示器”EllipseGeometry的Center偏移量等于外部EllipseGeometry的半径,因此您只能简单地围绕坐标原点旋转它。

<Canvas Width="512" Height="512">
    <Canvas Canvas.Left="256" Canvas.Top="256">
        <Path Opacity=".15" Stroke="Aqua" StrokeThickness="10">
            <Path.Data>
                <EllipseGeometry RadiusX="200" RadiusY="200"/>
            </Path.Data>
        </Path>
        <Path Fill="Aqua">
            <Path.Data>
                <EllipseGeometry RadiusX="8" RadiusY="8" Center="0,-200"/>
            </Path.Data>
            <Path.RenderTransform>
                <RotateTransform Angle="{Binding Angle, ElementName=clock}"/>
            </Path.RenderTransform>
        </Path>
    </Canvas>
</Canvas>

字符串
作为Path的RenderTransform的替代,您还可以设置EllipseGeometry的Transform属性:

<Canvas Width="512" Height="512">
    <Canvas Canvas.Left="256" Canvas.Top="256">
        <Path Opacity=".15" Stroke="Aqua" StrokeThickness="10">
            <Path.Data>
                <EllipseGeometry RadiusX="200" RadiusY="200"/>
            </Path.Data>
        </Path>
        <Path Fill="Aqua">
            <Path.Data>
                <EllipseGeometry RadiusX="8" RadiusY="8" Center="0,-200">
                    <EllipseGeometry.Transform>
                        <RotateTransform
                            Angle="{Binding Angle, ElementName=clock}"/>
                    </EllipseGeometry.Transform>
                </EllipseGeometry>
            </Path.Data>
        </Path>
    </Canvas>
</Canvas>

相关问题