Алгоритм для вычислений Диаграммы Вороного на сфере?

Как работают события и проблема с вашим кодом

События - это оболочка поверх Delegate, которая обеспечивает безопасный тип доступа, без возможности повредить делегировать состояние объекта. В вашем случае class A инициирует регистрацию события посредством вызова метода OnPageSwap, определенного в классе B, который в первую очередь должен вызвать метод Connect в классе C, который выполняет регистрацию события PageSwap и должен использовать тот же экземпляр объекта B, который используется для вызова метода Connect, так что регистрация событий может быть подключена и, таким образом, вызвана, new object B не требуется в Class C. Экземпляр может быть передан в методе или в конструкторе. Мой пример кода делает это в методе Connect(B sender)

Простыми словами

Вы не вызываете метод Connect в [ 1110], а затем регистрация события внутри Connect method должна быть тем же объектом из Class B. Также дизайн события некорректен, так как он не является потокобезопасным и объект может быть поврежден. Событие должно быть выставлено через аксессор.

Ниже приводится рабочая версия кода, включая тестовую консоль

void Main()
{
    new A().Button_Click(this, new RoutedEventArgs());
}

public class A
{
    public void Button_Click(object sender, RoutedEventArgs startEventArgs)
    {
        B senders = new B();
        senders.OnPageSwap(new StartEventArgs());
    }
}

public delegate void StartEventHandler(object sender, StartEventArgs e);

public class B
{
    private event StartEventHandler _PageSwap;

    private readonly object _lock = new Object();

    // Event Access via thread safe accessor
    public event StartEventHandler PageSwap
    {
        add
        {
            lock (_lock)
            {
                 _PageSwap += value;
            }
        }

        remove
        {
            lock (_lock)
            {
                 _PageSwap -= value;
            }
        }
    }

    public virtual void OnPageSwap(StartEventArgs e)
    {
        Console.WriteLine("Entered PageSwapSender");
        var c = new C();
        c.Connect(this);
        if (_PageSwap != null) _PageSwap(this, e);
    }
}

public class C
{

    public void Connect(B sender)
    {
        sender.PageSwap += new StartEventHandler(this.sender_PageSwap);
        Console.WriteLine("Entered Connect");
    }

    private void sender_PageSwap(object sender, StartEventArgs e)
    {
        Console.WriteLine("Entered Handler");
    }
}

public class StartEventArgs : EventArgs
{

}

Изменения: [ 1127]

  1. Изменено определение метода Connect на public void Connect(B sender), так что class C получает тот же объект класса B, который вызывает метод Connect внутри public virtual void OnPageSwap(StartEventArgs e) из Class B ]
  2. Создано StartEventArgs в качестве заполнителя, который может быть заменен реальным кодом
  3. Предоставлена ​​тестовая консоль для проверки вызова рабочего процесса / события
[1128 ] Результат:

Entered PageSwapSender
Entered Connect
Entered Handler

Редактировать 1:

Рядом с неверным доступом для событие, в котором не используется тот же объект, дизайн события имеет недостатки, его необходимо предоставлять через потоковый метод доступа, рассмотрим последнюю модификацию кода, где событие PageSwap предоставляется через потоковую оболочку

35
задан JonasCz - Reinstate Monica 30 March 2016 в 14:34
поделиться

4 ответа

Вот статья на сферические Диаграммы Вороного .

Или если Вы grok Фортран (bleah!) существует этот сайт .

Исходная (мертвая) ссылка: https://people.sc.fsu.edu/~jburkardt/f_src/sxyz_voronoi/sxyz_voronoi.html

12
ответ дан jrd1 27 November 2019 в 07:12
поделиться

Существует хороший пример программы Диаграммы Вороного здесь (включая исходный код для Delphi 5/6).

я думаю, что "точки на поверхности сферы" означают, что сначала необходимо повторно отобразить их на 2D координаты, создать Диаграмму Вороного и затем повторно отобразить их на координаты поверхности сферы. Эти две формулы от UV Википедии отображающаяся статья , работающая здесь?

Также уведомление, что Диаграмма Вороного будет иметь неправильную топологию (это в прямоугольнике и не "повторяется"), здесь это могло помочь скопировать все точки от (0,0) - (x, y) к соседним регионам выше (0,-y * 2) - (x, 0), ниже (0, y) - (x, y * 2), оставленный (-x, 0) - (0, y) и право (x, 0) - (x*2, y). Я надеюсь, что Вы знаете то, что я имею в виду, не стесняйтесь спрашивать :)

1
ответ дан schnaader 27 November 2019 в 07:12
поделиться

CGAL работает над пакетом «сферическое ядро», которое позволило бы вычислять именно такие вещи. К сожалению, еще не выпущен , но, возможно, он будет в их следующем выпуске, поскольку они уже упоминали его в техническом разговоре Google в марте

1
ответ дан 27 November 2019 в 07:12
поделиться

Я думаю, что плоскость Вороного для каждой точки может быть построена с использованием неевклидовой геометрии. То, что обычно было линией на 2-й плоскости, теперь превратилось в «большой круг» на сфере (см. Википедию: эллиптическая геометрия ). Легко найти, какие точки находятся на неправильной стороне любого большого круга между двумя точками, просто повернув сферу так, чтобы разделяющий большой круг был экватором, а затем все точки на другом полушарии, чем точка, в которой вы находитесь. построение самолета Вороного для.

Это не полный ответ, но я бы начал с него ..

2
ответ дан 27 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

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