Преобразуйте пользовательские элементы управления в управление сервером

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

def polygon_area(x,y):
    # coordinate shift
    x_ = x - x.mean()
    y_ = y - y.mean()
    # everything else is the same as maxb's code
    correction = x_[-1] * y_[0] - y_[-1]* x_[0]
    main_area = np.dot(x_[:-1], y_[1:]) - np.dot(y_[:-1], x_[1:])
    return 0.5*np.abs(main_area + correction)

Например, общей системой географической привязки является UTM, которая может иметь (x, y) координаты (488685.984, 7133035.984). Произведение этих двух значений равно 3485814708748.448. Вы можете видеть, что этот единственный продукт уже на грани точности (он имеет то же количество десятичных разрядов, что и входные данные). Добавление лишь нескольких из этих продуктов, не говоря уже о тысячах, приведет к потере точности.

Простой способ смягчить это - сдвинуть многоугольник от больших положительных координат к чему-то ближе к (0,0), например, вычитая центроид, как в коде выше. Это помогает двумя способами:

,
    ,
  1. . Он исключает коэффициент x.mean() * y.mean() для каждого продукта
  2. . В каждом точечном произведении получается сочетание положительных и отрицательных значений, что в значительной степени отменяет .

Смещение координат не изменяет общую площадь, оно просто делает расчет более устойчивым в численном отношении.

7
задан Chris Cudmore 1 June 2009 в 15:59
поделиться

2 ответа

Есть ли причина, по которой вы должны преобразовать эти пользовательские элементы управления в серверные? Помните, что можно скомпилировать пользовательский элемент управления в сборку .

6
ответ дан 7 December 2019 в 07:50
поделиться

Вы здесь нет волшебной пули, но поскольку у вас уже есть пользовательский элемент управления, это не так уж и сложно.

  1. Убедитесь, что все свойства, события и т. д. установлены в коде позади, так как у вас не будет никакой разметки, когда вы ' re done
  2. Создание нового серверного элемента управления
  3. Вставьте весь код обработки событий и настройки свойств в новый элемент управления
  4. , переопределите метод Render для каждого дочернего элемента управления, вызовите метод RenderControl, передавая его в предоставленном HtmlTextWriter

     защищенное переопределение void Render (HtmlTextWriter writer)
    {
     Поле TextBox = новое TextBox ();
     // Устанавливаем здесь все свойства
     box.RenderControl (писатель);
     base.Render (писатель);
    }
    
1
ответ дан 7 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

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