我正在为我正在制作的游戏制作一个库存屏幕,我希望能够绘制一系列代表库存中每个项目的面板。我希望能够将这些面板安装在圆形路径上。 这是我用我的意思做的模拟
http://fc02.deviantart.net/fs70/f/2010/280/7/2/khmp_magic_menu_concept_by_magna_alphamon-d30a7em.png
基本上我希望能够,给出一个半径,一个中心点和y坐标来开始绘制,绘制这一系列的面板,使它们与图像中的圆的路径对齐。
计算y维度很简单,它只是起始位置y +面板高度*面板索引,但我不确定如何计算可变半径/中心点圆的x。
任何帮助将不胜感激。
这是在C#中,但只要我可以转换它就可以在C / C ++中使用类似的东西
提前致谢
编辑:要进行校准,y的位置相对于屏幕的顶部或底部,并且与圆圈无关。如果给定的y没有映射到圆上的某个点,那么我将丢弃该点并且不绘制该面板。
虽然理想情况下我希望能够使用任何椭圆形状(给定两个半径),圆圈也会很好
答案 0 :(得分:1)
设cx,cy为中心点的坐标。设r是圆的半径。设y为绘制y坐标,x为x坐标。您观察到y = cy +面板高度*面板索引。通过直角三角形的魔力,这意味着x ^ 2 + y ^ 2 = r ^ 2。求解x,得到x = cx + sqrt(r^2 - (y-cy)^2)
。
编辑:转换为代码:
#include <math> float ordinate(float cx, float cy, float r, float y) { // assumes cx and cy are in the same coordinate system as x and y // assumes the coordinate origin is in the lower left corner. return cx + sqrtf(powf(r,2) - powf(y-cy,2)); }
答案 1 :(得分:0)
我很蠢。在看到Eric的回答之后,我记得我可以根据需要重新排列并解决圆或椭圆的方程。
由于
答案 2 :(得分:-3)
您可以使用旋转矩阵。这是一个简单的算法,它找到下一个点{x,y},使得它围绕一个圆旋转θ弧度。你可以从x =半径和y =半径的第一项开始(在任何地方,只要你知道它将包含一个项目),然后在循环浏览项目时继续增加theta。
Point Rotate(int x, int y, float theta)
int x_p = (x * Math.Cos(theta)) - (y * Math.Sin(theta));
int y_p = (y * Math.Cos(theta)) + (x * Math.Sin(theta));
return new Point(x_p, y_p);
end
旁注;我总是首选“Bolt1,Bolt2,Bolt3”为“Thunder,Thundara,Thundaga”= P