C# WPF中glOrtho的等价物
在OpenGL中,我可以执行以下操作: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或: 我在画布上
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);
}
}
}