Вычислите сплайн Безье для получения от точка-точка

[Если Вы хотите некоторый готовый к использованию код, прокрутите к моему "Edit3" (после сокращения). Остальное здесь для потомства.]

Для изложения в деталях идея Мусорщика :

List list = new ArrayList(Arrays.asList(array));
list.removeAll(Arrays.asList("a"));
array = list.toArray(array);

Редактирование: я теперь использую Arrays.asList вместо Collections.singleton: одиночный элемент ограничен одной записью, тогда как эти asList подход позволяет Вам добавлять другие строки для отфильтровывания позже: Arrays.asList("a", "b", "c").

Edit2: вышеупомянутый подход сохраняет тот же массив (таким образом, массив является все еще той же длиной); элемент после последнего устанавливается в NULL. Если Вы хотите новый , массив, измеренный точно как требуется, использует это вместо этого:

array = list.toArray(new String[0]);

Edit3: при использовании этого кода на частой основе в том же классе можно хотеть рассмотреть добавление этого к классу:

private static final String[] EMPTY_STRING_ARRAY = new String[0];

Тогда функция становится:

List list = new ArrayList<>();
Collections.addAll(list, array);
list.removeAll(Arrays.asList("a"));
array = list.toArray(EMPTY_STRING_ARRAY);

Это тогда прекратит замусорить Вашу "кучу" бесполезными массивами пустой строки, которые иначе были бы new редактор каждый раз, когда Ваша функция вызвана.

предложение cynicalman (см. комментарии) также поможет с замусориванием "кучи", и для справедливости я должен упомянуть его:

array = list.toArray(new String[list.size()]);

я предпочитаю свой подход, потому что может быть легче понять явный размер превратно (например, звоня size() в неправильном списке).

10
задан Glorfindel 18 May 2019 в 19:05
поделиться

2 ответа

Just saw that I misunderstood your question. Couldn't you use a single cubic hermite splines instead since you have a start and end point and two directions (tangents)? Are there any additional constraints?

To calculate the start and end tangents just use the start and end direction and scale them with the distance between the start and end points (and additionally some other constant factor like 0.5 depending on how curvy you want the path to be).:

p0 = startpoint;
p1 = endpoint;
float scale = distance(p0, p1);
m0 = Vec2(cos(startangle), sin(startangle)) * scale;
m1 = Vec2(cos(endangle), sin(endangle)) * scale;

I use this system to interpolate camera paths in a game I'm working on and it works great.

5
ответ дан 4 December 2019 в 01:01
поделиться
var x  =  from row in table
          where row.ID == 0
          select row

Предположим, у вас есть DataTable, который знает о строк, в противном случае вам нужно будет использовать индекс строки:

where row[rowNumber] == 0

В этом случае вы также захотите использовать select, чтобы поместить данные строки в анонимный класс или подготовленный класс (если вы хотите передать его в другой способ)

B x (t) = (1-t) 3 P 1x + 3 (1-t) 2 t P 2x + 3 (1-t) t 2 P 3x + t 3 P 4x

B y (t) = (1-t) 3 P 1y + 3 (1-t) 2 t P 2y + 3 (1-t) t 2 P 3y + t 3 P 4y

P 1 ] и P 4 - ваши конечные точки, а P 2 и P 3 - это контрольные точки, которые вы можете свободно выбирать под нужными углами. Если ваша контрольная точка находится на расстоянии r по углу θ от точки (x, y) , координаты точки следующие:

x '= x - r sin (θ)

y '= y - r cos (θ)

(согласно системе координат вы' я использовал - я думаю я правильно понял знаки). Единственный свободный параметр - r , который вы можете выбрать по своему усмотрению. Вероятно, вы захотите использовать

r = α dist (P 1 , P 4 )

с α <1.

4
ответ дан 4 December 2019 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: