Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF中glOrtho的等价物_C#_Wpf_Xaml - Fatal编程技术网

C# WPF中glOrtho的等价物

C# WPF中glOrtho的等价物,c#,wpf,xaml,C#,Wpf,Xaml,在OpenGL中,我可以执行以下操作: glOrtho(-10, 10, -10, 10, -1, 1) 建立一个坐标系,其中x的范围为-10到10,y的范围为-10到10 有没有办法在WPF中更改画布的坐标系?提供了正交投影,而不是更常见的透视投影(透视摄影机) 要建立从相机可见的坐标“范围”,您可能需要摆弄宽度和位置属性。只要您不设置画布.Top,画布.Left,画布.Right或画布.Bottom属性,您可以将画布中每个子级的或属性设置为适当的TransformGroup或: 我在画布上

在OpenGL中,我可以执行以下操作:

glOrtho(-10, 10, -10, 10, -1, 1)
建立一个坐标系,其中x的范围为-10到10,y的范围为-10到10

有没有办法在WPF中更改画布的坐标系?

提供了正交投影,而不是更常见的透视投影(
透视摄影机


要建立从相机可见的坐标“范围”,您可能需要摆弄
宽度
位置
属性。

只要您不设置
画布.Top
画布.Left
画布.Right
画布.Bottom
属性,您可以将画布中每个子级的或属性设置为适当的TransformGroup或:


我在画布上创建了一个扩展方法,允许您设置笛卡尔坐标系。调用的一个示例是:

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;
}
下面是一个演示程序,它在画布上绘制Sin(x)以及x和Y轴:

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);
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Windows;
使用System.Windows.Controls;
使用System.Windows.Data;
使用System.Windows.Documents;
使用System.Windows.Input;
使用System.Windows.Media;
使用System.Windows.Media.Imaging;
使用System.Windows.Navigation;
使用System.Windows.Shapes;
名称空间画布比例
{
公共静态类画布
{
公共静态画布SetCoordinateSystem(此画布画布,双xMin,双xMax,双yMin,双yMax)
{
变量宽度=xMax-xMin;
var高度=yMax-yMin;
var translateX=-xMin;
var translateY=高度+yMin;
var group=新的TransformGroup();
添加(新的TranslateTransform(translateX,-translateY));
添加(新的ScaleTransform(canvas.ActualWidth/width,canvas.ActualHeight/-height));
canvas.RenderTransform=组;
返回画布;
}
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
var canvas=newcanvas();
内容=画布;
SizeChanged+=(s,e)=>canvas.SetCoordinateSystem(-10,10,-10,10);
Add(新行(){X1=-10,Y1=0,X2=10,Y2=0,Stroke=brush.Black,StrokeThickness=0.2});
Add(新行(){X1=0,Y1=-10,X2=0,Y2=10,Stroke=brush.Black,StrokeThickness=0.2});
var polyline=新的多段线()
{
笔划=刷子。粗木,
冲程厚度=0.1,
点=新的点集合()
};

对于(var x=-10.0;x,您将如何在画布中定位元素?
顶部
左侧
右侧
底部
属性将失去其意义。嗨,克莱门斯。我最终按照这些思路做了一些事情。我添加了一个。注意Canvas.ActualHeight可以是(和是)InitializeComponent()之后立即为零,因此
0/x=0
并且您已将ScaleTransform设置为{0;0}。这可能会令人困惑,因为画布会消失…解决方案:
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);
        }
    }
}