2

OpenGLではこれを行うことができます:

glOrtho(-10, 10, -10, 10, -1, 1)

xが-10から10の範囲で、yが-10から10の範囲である座標系を確立します。

WPFでキャンバスの座標系を変更する方法はありますか?

4

3 に答える 3

11

デカルト座標系を設定できる拡張メソッドをCanvasで作成しました。呼び出しの例は次のとおりです。

canvas.SetCoordinateSystem(-10, 10, -10, 10)

canvasこれにより、xが-10から10になり、yが-10から10になるようにの座標系が設定されます。

拡張メソッドは次のとおりです。

public static Canvas SetCoordinateSystem(this Canvas canvas, Double xMin, Double xMax, Double yMin, Double yMax)
{
    var width = xMax - xMin;
    var height = yMax - yMin;

    var translateX = -xMin;
    var translateY = height + yMin;

    var group = new TransformGroup();

    group.Children.Add(new TranslateTransform(translateX, -translateY));
    group.Children.Add(new ScaleTransform(canvas.ActualWidth / width, canvas.ActualHeight / -height));

    canvas.RenderTransform = group;

    return canvas;
}

これは、X軸とY軸とともにSin(x)をキャンバスにプロットするデモプログラムです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace CanvasScale
{
    public static class CanvasUtils
    {
        public static Canvas SetCoordinateSystem(this Canvas canvas, Double xMin, Double xMax, Double yMin, Double yMax)
        {
            var width = xMax - xMin;
            var height = yMax - yMin;

            var translateX = -xMin;
            var translateY = height + yMin;

            var group = new TransformGroup();

            group.Children.Add(new TranslateTransform(translateX, -translateY));
            group.Children.Add(new ScaleTransform(canvas.ActualWidth / width, canvas.ActualHeight / -height));

            canvas.RenderTransform = group;

            return canvas;
        }
    }

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

            var canvas = new Canvas();

            Content = canvas;

            SizeChanged += (s, e) => canvas.SetCoordinateSystem(-10, 10, -10, 10);                

            canvas.Children.Add(new Line() { X1 = -10, Y1 = 0, X2 = 10, Y2 = 0, Stroke = Brushes.Black, StrokeThickness = 0.2 });
            canvas.Children.Add(new Line() { X1 = 0, Y1 = -10, X2 = 0, Y2 = 10, Stroke = Brushes.Black, StrokeThickness = 0.2 });

            var polyline = new Polyline()
            {
                Stroke = Brushes.BurlyWood,
                StrokeThickness = 0.1,
                Points = new PointCollection()
            };

            for (var x = -10.0; x <= 10.0; x += 0.1)
                polyline.Points.Add(new Point(x, Math.Sin(x)));

            canvas.Children.Add(polyline);
        }
    }
}

外観は次のとおりです。

ここに画像の説明を入力してください

于 2012-10-26T19:53:10.987 に答える
1

Canvas.Top、、、またはプロパティも設定しない限りCanvas.Left、 Canvas内の各子のLayoutTransformまたはRenderTransformプロパティを適切なTransformGroupまたはMatrixTransformに設定できます。Canvas.RightCanvas.Bottom

Rect viewport = new Rect(-10, -10, 20, 20);
double scaleX = ActualWidth / viewport.Width;
double scaleY = ActualHeight / viewport.Height;
RenderTransform = new MatrixTransform(
    scaleX, 0d, 0d, scaleY, -viewport.X * scaleX, -viewport.Y * scaleY);
于 2012-10-26T07:11:52.530 に答える
1

OrthographicCameraより一般的な透視投影()の代わりに正射影を提供しますPerspectiveCamera

カメラから見える座標の「範囲」を確立するには、おそらくWidthPositionプロパティをいじる必要があります。

于 2012-10-26T02:38:28.823 に答える