Я хотел бы нарисовать повернутый эллипс с центром в начале координат Я знаю как это сделать в R и теорию
Мой алгоритм:
Мой код:
deg2rad(t):= float(t*2*%pi/360)$
GiveRotatedEllipse(a,b,theta, NumberOfPoints):=block(
[x, y, zz, t , tmin, tmax, dt, c, s],
zz:[],
dt : 1/NumberOfPoints,
tmin: 0,
tmax: 2*%pi,
c:float(cos(theta)),
s:float(sin(theta)),
for t:tmin thru tmax step dt do(
x: a*cos(t)*c - b*sin(t)*s,
x: float(x),
y: a*cos(t)*c + b*sin(t)*c,
y:float(y),
zz: cons([x,y],zz)
),
return (points(zz))
)$
/* compute */
/* angles fo trigonometric functions in radians */
angle_step :deg2rad(15) $ /* 2*%pi/3$ */
radius_x: 3$
radius_y: 2$
e0:GiveRotatedEllipse(radius_x, radius_y, 0, 100)$
e1: GiveRotatedEllipse(radius_x, radius_y, angle_step, 100)$
e2: GiveRotatedEllipse(radius_x, radius_y, 2*angle_step, 100)$
path:""$
load(draw);
draw2d(
user_preamble = "set key top right; unset mouse",
terminal = 'png,
file_name = sconcat(path,"e"),
dimensions = [1000, 1000],
proportional_axes = xy,
line_width = 2,
line_type = solid,
fill_color = white,
point_type=filled_circle,
point_size = 0.5,
key = "e0",
color = red,
e0,
key= "e1",
color=blue,
e1,
key= "e2",
color= green,
e2
)$
и результат:
Все эллипсы повернуты на один и тот же угол. Где я сделал ошибку?
ТИА
Адам
@Robert Dodier: спасибо за подсказку. Я делал это здесь en.wikipedia.org/wiki/User:Adam_majewski/sandbox#ellipse Также код из R-программы вроде похож, но проверить могу.
Ваше «y: acos(t)*c + bsin(t)*c» кажется неверным. Попробуйте изменить его на "y: acos(t)*s + bsin(t)*c", чтобы проверить, работает ли он.
@fang преобразовать комментарий в ответ
Результат: commons.wikimedia.org/wiki/File:Nested_Ellipses.png
Формула «y: acos(t)*c + bsin(t)*c» не кажется правильной. Попробуйте изменить его на "y: acos(t)*s + bsin(t)*c", чтобы проверить, работает ли он.
Результат с помощью клыка:
Не уверен, где проблема в этой программе, но может быть проще найти рабочее решение, разделив его на части. Сначала создайте матрицу вращения, затем создайте список точек, затем примените вращение к каждой точке, а затем нанесите точки на график. Когда у вас есть матрица вращения
R
и список точекx
, вы можете просто сказать:x_rotated: map (lambda ([x1], R . x1), x)
. Попробуйте сначала с очень коротким списком пунктов, чтобы вы посмотрели на каждый и увидели, верны ли они. Надеюсь это поможет.