Почему System.Drawing.Rectangle позволяют содержать отрицательные размеры (ширина, высота)? - PullRequest
0 голосов
/ 09 июня 2019

Я понимаю, что ctor Rectangle (и RectangleF) допускает отрицательные размеры, но я не понимаю, почему ctor не переводит это в "реальные значения", которые должны иметь прямоугольник, например:

x:0, y:0, w:-100, h:200 == x:-100, y:0, w:100, h:200

И так далее.Это не имеет смысла.Если вы попросите область в первом случае (Ш х В), вы получите ... отрицательную область.Если вы попросите периметр, то он полностью сломан.Это заставляет вас писать множество шаблонов Math.Abs, когда логика и математика (базовая математика) говорят: «Размеры формы не могут быть отрицательными».

А если вы используете FromLTRB, тогда у вас естьначать делать min и max, и это много грязного кода.

Есть ли какая-то тонкая причина, почему команда .net сделала Rectangle ctor таким образом?

И, в конце концов,Есть ли какой-либо метод для построения прямоугольников "в правильном направлении", или я должен сделать один?

Редактировать: Я нашел другую проблему, я назову это ошибкой;если вы используете отрицательный x (например, -100) и отрицательную ширину (например, -200), он говорит: «Мое право - -300».И то же самое с Top & Bottom & Left.Ницца!Я могу понять, как он относится к размерам негативов, но это кажется мне неприемлемым.Теперь право не правильно ...

1 Ответ

0 голосов
/ 09 июня 2019

Для меня прямоугольник с отрицательными размерами был бы просто прямоугольником, который вытянут влево и вверх от его исходной точки, а не вправо и вниз на классическом рисунке? На него нет никаких ограничений, потому что это всего лишь пара из 4 чисел, и нет ограничения на то, может ли число быть отрицательным или нет - отрицательная ширина может что-то значить для вашего приложения

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

class Rectitive{
  private Rectangle r;
  public Rectangle R { get{return r}; private set; }

  public int Width { get { return r.Width } set { r.Width = math.Abs(value); } }

  public Rectitive(int x, int y, int w, int h){
    r = new Rectangle(Math.Abs(x) ...);
  }


}



e.Graphics.DrawRectangle(myRectitive.R);

Обратите внимание, что это бизнес-правила, которые вы определяете сами. Если бы я писал эту систему, которая работает с прямоугольниками отрицательного размера, я бы превратил прямоугольник в местоположении 50,70 размера -100, -200 в прямоугольник в -50, -130 размера 100,200

...