赞
踩
很多瓦块地形都是2.5D的视角呈现世界,在网上查了一些资料,发现从直角坐标变换到2.5D的坐标需做两步:一、旋转45度,二、再把瓦块地图的高压缩一半。
于是乎,第一步旋转后的坐标,比如那个黑色的点的坐标,可以通过计算公式得到:
然后用C#程序来实现是这个样子:
C#程序实现如下:
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
-
- namespace _25Dpoint
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
-
- private void Form1_Paint(object sender, PaintEventArgs e)
- {
- Graphics g = this.CreateGraphics();
- SolidBrush brushBlack = new SolidBrush(Color.Black);
-
- g.DrawLine(Pens.Black, 200, 0, 200, 400); //画出直角坐标系的x,y轴
- g.DrawLine(Pens.Black, 0, 200, 400, 200);
-
- float x1 = 20, y1 = 180; //假设黑点的坐标为20,180 (这个坐标数字是WIN屏幕的坐标,从直角坐标系到WIN屏幕坐标系是不同的,需要转换一下)
-
- Point winpoint1 = screen_point(x1, y1); //直角坐标系到WIN屏幕坐标系
- g.DrawString(winpoint1.X.ToString() + "," + winpoint1.Y.ToString(), Font, brushBlack, winpoint1.X, winpoint1.Y); //显示字符串
- g.FillEllipse(brushBlack, winpoint1.X, winpoint1.Y, 5, 5); //显示点
-
- float x2 = (float) (x1 * Math.Cos(-45) - y1 * Math.Sin(-45)); //坐标转轴公式 顺时针转45度
- float y2 = (float) (x1 * Math.Sin(-45) + y1 * Math.Cos(-45));
-
- Point winpoint2 = screen_point(x2, y2);
- g.FillEllipse(brushBlack, winpoint2.X, winpoint2.Y, 5, 5); //显示字符串
- g.DrawString(winpoint2.X.ToString() + "," + winpoint2.Y.ToString(), Font, brushBlack, winpoint2.X, winpoint2.Y); //显示转换后的点
-
-
- }
-
- public Point screen_point(float cartX, float cartY)
- {
- Point screenpoint = new Point();
- screenpoint.X = (int) cartX + ( 400/2 );
- screenpoint.Y = (400/2) - (int)cartY;
-
- return screenpoint;
- }
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。