Как называется эта геометрическая функция? - PullRequest
2 голосов
/ 25 марта 2010

В двумерном целочисленном пространстве у вас есть две точки, A и B. Эта функция возвращает перечисление точек в четырехугольном подмножестве, ограниченном A и B.

A = {1,1} B = {2,3}

Fn (A, B) = {{1,1}, {1,2}, {1,3}, {2,1}, {2,2}, {2,3}}

Я могу реализовать это в несколько строк LINQ.

private void UnknownFunction(Point to, Point from, List<Point> list)
{
    var vectorX = Enumerable.Range(Math.Min(to.X, from.X), Math.Abs(to.X - from.Y) + 1);
    var vectorY = Enumerable.Range(Math.Min(to.Y, from.Y), Math.Abs(to.Y - from.Y) + 1);
    foreach (var x in vectorX)
        foreach (var y in vectorY)
            list.Add(new Point(x, y));
}

Я вполне уверен, что это стандартная математическая операция, но я не могу думать, что это такое. Не стесняйтесь сказать мне, что это одна строка кода на вашем языке. Или дать мне хитрую реализацию с лямбдами или чем-то подобным.

Но в основном я просто хочу знать, как это называется . Это сводит меня с ума. Это немного похоже на свертку, но прошло слишком много времени с тех пор, как я был в школе, чтобы я был уверен.

Ответы [ 4 ]

5 голосов
/ 25 марта 2010

Это декартово произведение наборов {1,2} и {1,2,3} в вашем конкретном примере или вообще декартово произведение vectorX и vectorY в вашем примере кода.

1 голос
/ 25 марта 2010

Декартово произведение с использованием списка в

Python

[(x,y) for x in [1,2] for y in [1,2,3] ]

и Haskell

[(x,y) | x <- [1,2] , y <- [1,2,3] ]
1 голос
/ 25 марта 2010

Целые числа / точки решетки в границах / прямоугольнике.

(аналогично названию http://en.wikipedia.org/wiki/Integer_points_in_convex_polyhedra)

1 голос
/ 25 марта 2010

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

Учитывая две точки, (x_1, x_2) и (y_1, y_2) в N ^ 2. Затем возьмите min_1 для min (x_1, y_1) и max_1 для max (x_1, y_1) и симметричные операции для min_2 и max_2. Тогда набор определяется как:

Enum = {(a, b): a, b в N ^ 2 и min_1 <= a <= max_1 и min_2 <= b <= max_2} </p>

Что кажется мне довольно произвольным, и я бы сказал, что для меня это не совсем стандартная математическая операция.

Решение с использованием декартового произведения становится сложнее. Использовать декартово произведение было просто, когда у вас есть точки, которые находятся так близко друг к другу, но как быть, когда у вас есть {1,1} и {8,8}. Тогда проблема немного сложнее. Вы берете два комплекта:

{a: min (x_1, y_1) <= a <= max (x_1, y_1)} и {b: min (x_2, y_2) <= b <= max (x_2, y_2)} </p>

В обоих случаях вы просто берете все значения в диапазоне и перечисляете по всему пространству. Еще раз, хотя, это похоже на произвольную операцию, и, возможно, я ошибаюсь, но я не думаю, что у этого есть хорошо известное имя. Помимо перечисления точек в прямоугольнике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...