3

全体的にやりたいのは、円周の中心からゴルフパターが一定の角度で打ったときの円周上のゴルフボールの位置を表す楕円をキャンバスに追加することです。これを行うために、2つの画像を使用しています。1つは、ボールが打たれた角度を表すためにセクションに分割された円です。もう1つの画像は、クラブがボールを打つ角度を表すために回転するパターヘッドです。この画像は、円の画像の上にあります。青い楕円はボールの位置を表しています。以下のリンクで、アプリケーションから取得した画像出力を参照してください。

必要なアプリケーション出力

これを行うために、私は基本的に次のコードを使用してグリッドの幅と高さを計算しました。

public FacePage()
{
    InitializeComponent();
    GridGraphs.SizeChanged += GridGraphs_SizeChanged;
}

void GridGraphs_SizeChanged(object sender, SizeChangedEventArgs e)
{
    GetMeasurements();
}

private void GetMeasurements()
{
    GridGraphs.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));

    double width = GridGraphs.DesiredSize.Width;
    double height = GridGraphs.DesiredSize.Height;

    RotatePutter(width, height);
}

次に、幅と高さをRotatePutter()に渡し、幅と高さを2で割って、グリッドの中心点を取得します。以下を参照してください。

public void RotatePutter(double width, double height)
{

    double radius = width * 0.5;
    double centerX = width * 0.5;
    double centerY = height * 0.5;

    Random ran = new Random();
    double angle = ran.Next(-15, 15);

    if (angle >= 0)
    {
        if (angle <= 5)
        {
            lblShotStaus.Content = "Square";
        }
        else
        {
            lblShotStaus.Content = "Open";
        }
    }
    else
    {
        lblShotStaus.Content = "Closed";
    }

    double angleradians = (angle * (Math.PI / 180));

    Point putterCentre = new Point(0.5, 0.5);

    imgPutter.RenderTransformOrigin = putterCentre;

    RotateTransform rt = new RotateTransform(angle, 0.5, 0.5);
    imgPutter.RenderTransform = rt;

    BallLocation(radius, angleradians, centerX, centerY);
}

ここで中心点、半径、角度、パターの画像が回転し、半径、角度半径、centerX、centerYがBallLocationに渡され、次のようにボールの位置が計算されます。

public void BallLocation(double rad, double anglerad, double centerX, double centerY)
{
    Ellipse ellipse = new Ellipse();

    double xBallPoint = (centerX - (rad * Math.Cos(anglerad)));
    double yBallPoint = (centerY - (rad * Math.Sin(anglerad)));

    ellipse.Height = 10;
    ellipse.Width = 10;
    ellipse.Fill = new SolidColorBrush(Colors.Aqua);

    Canvas.SetLeft(ellipse, xBallPoint);
    Canvas.SetTop(ellipse, yBallPoint);
    canvasFaceAngle.Children.Add(ellipse);
}

これはフルスクリーンで問題なく動作します。ウィンドウのサイズを変更すると、ボールが当たった角度のボールの位置がすべて間違っています。

楕円(ボール)の正しい位置を計算するために、ウィンドウサイズの変更に応じてグリッドの幅と高さを動的に取得する方法を知っている人はいますか?または、これを完了する他の代替方法も歓迎されます。前もって感謝します。

これが私のxamlです:

<UserControl x:Class="HoleMorePuttsApplication.Pages.FacePage"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="40*"/>
        <ColumnDefinition Width="60*"/>
    </Grid.ColumnDefinitions>
    <Viewbox Grid.ColumnSpan="1">
        <Label Content="Face Angle Page" FontWeight="Bold" />
    </Viewbox>
    <Grid Name="GridGraphs" Column="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Name="columnLeft" Width="50*"/>
            <ColumnDefinition Name="columnRight" Width="50*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Name="rowTop" Height="70*"/>
            <RowDefinition Name="rowBottom" Height="30*"/>
        </Grid.RowDefinitions>

        <Image x:Name="imgAngles"  Source="C:\Users\BernardWork\Documents\Work\Net\PuttingApp\Images\360Angles.jpg" Grid.ColumnSpan="2" HorizontalAlignment="Left" VerticalAlignment="Top"/>
        <Image x:Name="imgPutter"   Source="C:\Users\BernardWork\Documents\Work\Net\PuttingApp\Images\Putter.jpg" Opacity="0.5" Margin="130,105,70,105" Grid.ColumnSpan="2" HorizontalAlignment="Left" VerticalAlignment="Bottom"/>
        <Label x:Name="lblShotStaus" Content="Label" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>
        <Canvas Name="canvasFaceAngle" Grid.ColumnSpan="2" Grid.Row="0" RenderTransformOrigin="0.543,0.511"></Canvas>


    </Grid>

</Grid>

4

2 に答える 2

1

私が正しいことを理解していれば、問題は次のようなものである可能性があると思います。

double width = GridGraphs.DesiredSize.Width;
double height = GridGraphs.DesiredSize.Height;

境界を指定せずに Measure を呼び出しています。Gridつまり、制限がない場合のサイズが示されます (したがって、DesiredSize)。DesiredSizeと は2ActualSizeつの非常に異なる値である場合があります。

上記の場合、SizeChangedメソッドの引数は必要なものを提供します。

void GridGraphs_SizeChanged(object sender, SizeChangedEventArgs e)
{
    RotatePutter(e.NewSize.Width, e.NewSize.Height);
}
于 2013-02-05T16:56:23.123 に答える
0

したがって、目的がグリッドの幅/高さを取得することだけである場合、ActualWidthおよびActualHeightプロパティはその情報を提供する必要があります。Gridコントロールはウィンドウに合わせてサイズを変更しますが、Canvasコントロールは変更しません。つまり、グリッドの実際の幅/高さを読み取ると、ウィンドウの側面に対応するはずですが、キャンバスの実際の幅/高さを読み取ると、おそらく誤った情報が得られます。

于 2013-02-05T16:56:00.550 に答える