3

基本的に、ペイントのようにマウスが移動する場所に線を描画したいのですが、ダニごとにmousePosにドットを描画すると、次のようになります。

これが起こります

今、私はこれを線に変える助けが必要です、それはギャップや奇妙なことは何もありません。助けてくれてありがとう。

行を生成するために使用しているコード(これは写真のコードではありません!)

        protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);

        spriteBatch.Begin();

        Line newLine = new Line(pixel, point1, point2, 2, Color.White);
        allLines.Add(newLine);

        foreach (Line lines in allLines) 
        {
            lines.Draw(spriteBatch);
        }

        spriteBatch.End();

        base.Draw(gameTime);
    }

およびラインオブジェクト:

    public class Line
{
    Texture2D texture;
    Vector2 point1, point2;
    float width;
    Color color;
    float angle, length;

    public Line(Texture2D texture, Vector2 point1, Vector2 point2, float width, Color color) 
    {
        this.texture = texture;
        this.point1 = point1;
        this.point2 = point2;
        this.width = width;
        this.color = color;
        angle = (float)Math.Atan2(point2.Y - point1.Y, point2.X - point1.X);
        length = Vector2.Distance(point1, point2);
    }

    public void Draw(SpriteBatch spriteBatch) 
    {
        spriteBatch.Draw(texture, point1, null, color, angle, Vector2.Zero, new Vector2(length, width), SpriteEffects.None, 0);
    }
}
4

3 に答える 3

4

あなたがやりたいことは次のようなものです(pathfinder666の答えを拡張します):

private Point _lastPoint;

protected void MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
    Graphics g = CreateGraphics();
    g.LineTo(_lastPoint.X, _lastPoint.Y, e.X, e.Y);
    _lastPoint = new Point(e.X, e.Y);
}

ここで覚えておいてください、これは少しギザギザに見えるかもしれません。代わりにDrawArcを使用して、少し滑らかにすることをお勧めします。それはあなたが最終的に何を達成しようとしているのかによります。

于 2012-10-22T18:39:47.293 に答える
2

過去にマウスの動きに基づいて線/パスを描画する必要があったときに行ったことは、線ではなくPathオブジェクトを使用することです。

これがXAML/C#の例です。C#で新しいXAMLプロジェクトを開始し、これをデフォルトの「メインウィンドウ」に貼り付けるだけです。

MainWindow.xaml.cs:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private PathFigure _pathFigure = new PathFigure();
    PathFigureCollection _pathCollection = new PathFigureCollection();
    PathSegmentCollection _segments = new PathSegmentCollection();
    private PathGeometry _pathGeometry = new PathGeometry();

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        _pathFigure.Segments = _segments;
        _pathCollection.Add(_pathFigure);
        _pathGeometry.Figures = _pathCollection;
        myPath.Data = _pathGeometry;
    }

    private void Window_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            LineSegment segment = new LineSegment();
            segment.Point = e.GetPosition(this);
            _pathFigure.Segments.Add(segment);

        }
    }

    private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        _pathFigure.StartPoint = e.GetPosition(this);
    }
}

MainWindow.xaml:

<Window x:Class="TestPaths.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded" MouseMove="Window_MouseMove" MouseLeftButtonDown="Window_MouseLeftButtonDown">
    <Grid>
        <Path Stroke="Black" StrokeThickness="1" Name="myPath" />
    </Grid>
</Window>

出力

PathGeometryの例のMainWindow

この例では新しいパスは作成されないため、マウスの左ボタンをもう一度(現在の位置に)押すと、行がジャンプします。必要に応じて新しいパスを作成する機能を追加するのは非常に簡単です。

このサンプルでは、​​最後のポイントが既存のオブジェクトで常に使用可能であるため、新しいポイントを追跡する必要がなくなります。曲線の設定方法など、パスの詳細については、MSDNのPathGeometryDocsを参照してください。

于 2012-10-22T19:20:46.397 に答える
1

最後のポイントをメモリに保持し、その最後のポイントから現在のポイントまで線を引くのはどうですか。曲線を滑らかで視覚的に魅力的なものにするために、曲線を滑らかにする必要がある場合があります。

于 2012-10-22T18:33:17.207 に答える