Лучший способ Реализовать эти 3 класса в C#: Вектор, Направление (единичный вектор), Точка

Для версии 5.7 у меня была та же проблема, и простое исправление помогло. Как установлено Workbench 5.7, было еще одно «программное обеспечение», называемое «MySQL Installer Community». Я запустил это и запустил «Reconfigure» для сервера MySQL. Это заняло около минуты, и проблемы больше не было.

Надеюсь, что это работает! (Имейте в виду, что я использовал версию 5.7)

6
задан manixrock 7 August 2013 в 14:45
поделиться

6 ответов

Математически точки являются векторами. В космосе нет абсолютных точек. Точки определяются как векторы из некоторого произвольного начала. Итак, я использую векторы как для точек, так и для различий между точками.

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

Итак, определите один тип Vector. Это облегчит вашу жизнь, потому что у вас будет меньше классов и перегруженных операторов / функций для написания и тестирования, и вы будете математически «чище» (если это важно для вас).

11
ответ дан 8 December 2019 в 03:11
поделиться

На На уровне пуриста я бы сказал, что Вектор и Точка не одинаковы, по алгебре:

  • Точка + Вектор => Точка (перевод)
  • Вектор + Вектор => Вектор (сложение)
  • Точка + Point (не определено)

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


Я вырезал примитив Вектор и Точку , чтобы показать взаимодействия; Я не заполнил все Point (так как это проще):

public struct Point {
    public Point(double x, double y) : this() { X = x; Y = y; }
    public double X { get; private set; }
    public double Y { get; private set; }

    // and more ;-p
}

public struct Vector : IEquatable<Vector> {
    public Vector(double x, double y) : this() { X = x; Y = y; }
    public Vector AsUnit() {
        if (X == 0 && Y == 0) throw new InvalidOperationException();
        if (X == 0) return new Vector(0, X > 0 ? 1 : -1);
        if (Y == 0) return new Vector(Y > 0 ? 1 : -1, 0);
        double sqr = Math.Sqrt((X * X) + (Y * Y));
        return new Vector(X / sqr, Y / sqr);
    }
    public double X { get; private set; }
    public double Y { get; private set; }

    public static  explicit operator Point(Vector vector) {
        return new Point(vector.X, vector.Y);
    }
    public static explicit operator Vector(Point point) {
        return new Vector(point.X, point.Y);
    }
    public override string ToString() {
        return "(" + X.ToString() + "," + Y.ToString() + ")";
    }
    public override int GetHashCode() {
        return 17 * X.GetHashCode() + Y.GetHashCode();
    }
    public override bool Equals(object obj) {
        return obj == null ? false : Equals((Vector)obj);
    }
    public bool Equals(Vector vector) {
        return X == vector.X && Y == vector.Y;
    }
    public static bool operator ==(Vector a, Vector b) {
        return a.X == b.X && a.Y == b.Y;
    }
    public static bool operator !=(Vector a, Vector b) {
        return a.X != b.X || a.Y != b.Y;
    }
    public static Point operator +(Point point, Vector vector) {
        return new Point(point.X + vector.X, point.Y + vector.Y);
    }
    public static Point operator -(Point point, Vector vector) {
        return new Point(point.X - vector.X, point.Y - vector.Y);
    }
    public static Vector operator +(Vector a, Vector b) {
        return new Vector(a.X + b.X, a.Y + b.Y);
    }
    public static Vector operator -(Vector a, Vector b) {
        return new Vector(a.X - b.X, a.Y - b.Y);
    }
}
8
ответ дан 8 December 2019 в 03:11
поделиться

В .Net> = 3.0 уже есть реализации Point и Vector . К сожалению, они находятся в System.Windows.Media.Media3D , поскольку они являются частью WPF 3D API.

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

  • Точка [+ | -] Вектор = Точка
  • Вектор [+ | -] Вектор = Вектор
  • Точка - Точка = Вектор
  • В векторе есть статические методы для выполнения точки и пересечения products
  • Vector.Normalise () и vector.Negate () делают то, что они говорят на банке

Может быть, вы могли бы изучить (и даже расширить) их для собственного использования?

6
ответ дан 8 December 2019 в 03:11
поделиться

Я не рекомендую использовать как Вектор , так и тип Точка . Хотя математически они немного отличаются, это различие обычно не дает никаких преимуществ в контексте программирования. Кроме того, вы можете рассматривать точку как вектор от начала координат до местоположения точки.

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

Я также не рекомендую использовать тип Direction и предпочитаю использовать нормализованные векторы. Вместо трех типов Вектор , Точка и Направление ,

3
ответ дан 8 December 2019 в 03:11
поделиться

Если векторы - это точки, а точки - это векторы, тогда, возможно, они должны быть одного и того же класса (или одного типа структуры).

Или, если вы хотите, чтобы они ...

  • Имеют одинаковые реализации одних и тех же методов и операторов
  • Имеют разные имена и разные типы

... затем определяют методы и операторы в базовом классе с помощью защищенного конструктора и определяют Point и Vector как конечные подклассы этот базовый класс, чтобы они унаследовали его функциональность.

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

Можно сказать, что нет.Это имеет значение, поскольку все они являются векторами, но в C ++ вы можете легко провести различие, так почему бы не C #?

В C # тоже можно различать: C # поддерживает определение отдельных типов и т. д. Две вещи, которые вы можете сделать в C ++, вы не можете в C # использовать шаблоны и глобальные функции с утиным типом, которые могут быть здесь полезны, но не являются необходимыми, если вы вместо этого желаете либо использовать наследование, либо скопировать и вставить общий функционал.

вместо этого мы готовы либо использовать наследование, либо скопировать и вставить общий функционал.

вместо этого мы готовы либо использовать наследование, либо скопировать и вставить общий функционал.

1
ответ дан 8 December 2019 в 03:11
поделиться

Я предлагаю определить это как таковое:

public abstract class VectorBase {
    public int X { get; private set; }
    public int Y { get; private set; }

    public VectorBase(int x, int y) {
        this.X = x;
        this.Y = y;
    }

    public VectorBase(VectorBase copy) : this(copy.X, copy.Y) {
        // creates a vector with the same x, y
    }

    public static Vector operator +(VectorBase left, VectorBase right) {
        return new Vector(left.X + right.X, left.Y + right.Y);
    }

    public static Vector operator -(VectorBase left, VectorBase right) {
        return new Vector(left.X - right.X, left.Y - right.Y);
    }
}

public class Vector : VectorBase {
    public Vector(VectorBase v) : base(v) { }
    public Vector(int x, int y) : base(x, y) { }
}

public class Point : VectorBase {
    public Point(VectorBase v) : base(v) { }
    public Point(int x, int y) : base(x, y) { }

    public static implicit operator Vector(Point p) {
         return new Vector(p);
    }

    public static implicit operator Point(Vector v) {
         return new Point(v);
    }
}

public class Direction : VectorBase {
    public Direction(VectorBase v) : base(v) { }
    public Direction(int x, int y) : base(x, y) { }

    public static implicit operator Vector(Direction d) {
         return new Vector(d);
    }

    public static implicit operator Direction(Vector v) {
         return new Direction(v);
    }

    // implementation of *, any other stuff you need
}

На заметку:

  • Эта реализация неизменяема .
  • Любой тип - Вектор ], Точка или Направление может быть добавлено / вычтено из любого другого, в результате получится Вектор .
  • Направление можно умножить с вектором.
  • Они неявно взаимозаменяемы - вы можете легко изменить это на явно взаимозаменяемые, изменив неявный оператор s на явный оператор s.
1
ответ дан 8 December 2019 в 03:11
поделиться
Другие вопросы по тегам:

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