Ваш вопрос на самом деле представляет собой два вопроса в одном:
- Является ли кривая (как математический объект) симметричной c относительно оси x ?
- Кажется ли это так на картинке?
Ответ 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, ее рендеринг полилинии (черный) не обязательно:
Уже одно это может объяснить небольшие отличия от комментария @ Майка.
Ответ 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")
Мне они кажутся в значительной степени перекрывающимися, особенно принимая во внимание эффекты из ответа 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")