преобразование двойных значений для создания типа Point - PullRequest
8 голосов
/ 20 марта 2011

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

например, точка на моем графике выглядит так:

Напряжение: -0,175 Ток: -9,930625E-06

Да, это Двойной! Теперь, как я могу иметь точку, например:

        Point[] ptarray = new Point[3];
        ptarray[0] = new Point(250, 250);

Есть ли альтернатива Point [], которая принимает двойные значения? У меня есть 500x500 картинная коробка. Есть ли способ преобразовать эти значения в действительные точки, которые могут сохранить приоритет? Я работаю с микро-амперами (10 ^ -6) и напряжениями!

Ответы [ 3 ]

15 голосов
/ 20 марта 2011

Ну, если float достаточно точности, тогда вы можете использовать PointF struct :

var point = new PointF(3.5f, 7.9f);

Если вам действительно нужно, вы можете определить свой собственный PointD struct:

public struct PointD {
    public double X;
    public double Y;

    public PointD(double x, double y) {
        X = x;
        Y = y;
    }

    public Point ToPoint() {
        return new Point((int)X, (int)Y);
    }

    public override bool Equals(object obj) {
      return obj is PointD && this == (PointD)obj;
    }
    public override int GetHashCode() {
      return X.GetHashCode() ^ Y.GetHashCode();
    }
    public static bool operator ==(PointD a, PointD b) {
      return a.X == b.X && a.Y == b.Y;
    }
    public static bool operator !=(PointD a, PointD b) {
      return !(a == b);
    }
}

Код равенства изначально здесь .

Метод ToPoint() позволяет преобразовать его в объект Point, хотя, конечно,точность будет усечена.

1 голос
/ 20 марта 2011

Если это просто для хранения этих значений, всегда есть Tuple:

Tuple<double, double>[] Points = new Tuple<double, double>[50];
Points[0] = Tuple.Create<double, double>(5.33, 12.45);
0 голосов
/ 13 апреля 2018

Хотя структура System.Drawing.Point использует значения int, а структура System.Drawing.PointF использует значения float, существует также структура System.Windows.Point, которая использует значения double. Так что это, вероятно, ваш лучший выбор, если float не обеспечивает достаточной точности для ваших нужд.

Однако, так как имя структуры конфликтует с именем int, его может быть неудобно использовать в файле, в котором уже есть директива using System.Drawing:

using System.Drawing;
...
System.Windows.Point coords = new System.Windows.Point(1.5, 3.9);

К счастью, вы можете обойти это, используя псевдоним:

using System.Drawing;
using PointD = System.Windows.Point;
...
PointD coords = new PointD(1.5, 3.9);
...