Как сделать кривую xspline симметричным c в R? - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь нарисовать фигуру, используя функцию xspline в R. Используя набор контрольных точек, я могу получить фигуру, но она асимметрична c, хотя все точки и значения фигуры симметричны c .

Как нарисовать эту фигуру симметрично?

Этот доктор aws приблизительная форма, но линии показывают, как она асимметрична c.

curve <- data.frame(x=c(-0.1,-0.1,-0.1,-0.1,0.1,0.1,0.1,0.1,0.1,0.1,-0.1,-0.1,-0.1),y=c(0.1,0.1,0.1,0.3,0.3,0.1,0.1,-0.1,-0.1,-0.3,-0.3,-0.1,-0.1))
plot(curve)
xspline(curve,shape=1,open=F)
lines(x=c(-0.15,0.15),y=c(0.15,0.15),col="red")
lines(x=c(-0.15,0.15),y=c(-0.15,-0.15),col="red")

Я попытался изменить значения формы для каждого узла, но безуспешно. R plot output

1 Ответ

0 голосов
/ 14 марта 2020

Ваш вопрос на самом деле представляет собой два вопроса в одном:

  1. Является ли кривая (как математический объект) симметричной c относительно оси x ?
  2. Кажется ли это так на картинке?

Ответ 2

Даже если Ответ 1 был "Да" (в чем я сомневаюсь, см. Ниже) ), Я думаю, что ответ "Нет" Судя по документации 1016 *, xspline делает то, что она оценивает кривую во многих точках и затем строит ломаную, соединяющую их. Вы можете убедить себя: установив draw в F, следующее должно дать вам два массива, один из x - и один из y -значений.

curve <- data.frame(x=c(-0.1,-0.1,-0.1,-0.1,0.1,0.1,0.1,0.1,0.1,0.1,-0.1,-0.1,-0.1),y=c(0.1,0.1,0.1,0.3,0.3,0.1,0.1,-0.1,-0.1,-0.3,-0.3,-0.1,-0.1))
plot(curve)
pts=xspline(curve,shape=1,open=F,draw=F)
pts

Я не думаю, что есть какой-либо способ контролировать количество или плотность точек оценки. Таким образом, даже если ваша кривая (как математический объект, синий) симметрична c, ее рендеринг полилинии (черный) не обязательно:

The spline is symmetric but its rendering is not.

Уже одно это может объяснить небольшие отличия от комментария @ Майка.

Ответ 1

Мы не знаем точно, как R обеспечивает закрытие кривой. На основании документации

Для открытых X-сплайнов начальная и конечная контрольные точки должны иметь форму 0 (ненулевые значения автоматически преобразуются в ноль).

Я полагаю, что он добавляет еще одну контрольную точку в самом конце, делает ее равной первой и устанавливает shape обеих из них равными нулю. Но это отличается от того, как выглядят ваши контрольные точки на правой стороне картинки! Ваша контрольная точка (0.1, 0.1) повторяется дважды (не трижды, как (-0.1, 0.1)), и ее форма равна 1, а не 0 (предостережение: контрольная точка повторяется три раза, возможно, это не имеет никакого влияния; нам придется проверьте документ, связанный с документацией).

Я адаптировал это и нанес кривую и ее зеркальную версию так, чтобы мы увидели разницу.

curve <- data.frame(
  x=c(-0.1,-0.1,-0.1,-0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1,-0.1,-0.1,-0.1),
  y=c( 0.1, 0.1, 0.1, 0.3, 0.3, 0.1, 0.1, 0.1,-0.1,-0.1,-0.3,-0.3,-0.1,-0.1))
xswap <- data.frame(
  x=c( 0.1, 0.1, 0.1, 0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1, 0.1, 0.1, 0.1),
  y=c( 0.1, 0.1, 0.1, 0.3, 0.3, 0.1, 0.1, 0.1,-0.1,-0.1,-0.3,-0.3,-0.1,-0.1))

plot(curve)
xspline(curve,shape=c(0,1,1,1,1,1,1,0,1,1,1,1,1,1),open=F)
xspline(xswap,shape=c(0,1,1,1,1,1,1,0,1,1,1,1,1,1),open=F)
lines(x=c(-0.15,0.15),y=c(0.15,0.15),col="red")
lines(x=c(-0.15,0.15),y=c(-0.15,-0.15),col="red")

Symmetric-looking result

Мне они кажутся в значительной степени перекрывающимися, особенно принимая во внимание эффекты из ответа 2.

Общие рекомендации

  1. За исключением случаев, когда это абсолютно необходимо, не повторять контрольные точки. Это имеет тенденцию оказывать забавное влияние на основную параметризацию. Чаще всего (на мой взгляд) повторяющиеся контрольные точки исходят от людей, которые путают контрольные точки с узлами.

  2. Когда вы хотите симметрию относительно x - ось, поместите первую (и последнюю) контрольную точку на нее. Тогда вам не нужно беспокоиться о поиске соответствующей контрольной точки, для которой shape необходимо установить на 0.

Например,

curve <- data.frame(
x=c(0,  1,  1,  0, -1, -1),
y=c(1,  1, -1, -1, -1,  1))
curve_x_swapped <- data.frame(
x=c(0, -1, -1,  0,  1,  1),
y=c(1,  1, -1, -1, -1,  1))
plot(curve)
xspline(curve,          shape=1,open=F)
xspline(curve_x_swapped,shape=1,open=F,border="red")

Simpler symmetric example

...