Для версии 5.7 у меня была та же проблема, и простое исправление помогло. Как установлено Workbench 5.7, было еще одно «программное обеспечение», называемое «MySQL Installer Community». Я запустил это и запустил «Reconfigure» для сервера MySQL. Это заняло около минуты, и проблемы больше не было.
Надеюсь, что это работает! (Имейте в виду, что я использовал версию 5.7)
Математически точки являются векторами. В космосе нет абсолютных точек. Точки определяются как векторы из некоторого произвольного начала. Итак, я использую векторы как для точек, так и для различий между точками.
Поскольку направление является единичным вектором, здесь нет необходимости проводить различие. Это похоже на попытку определить разные статические типы для целого числа 1 и других целых чисел. Поэтому я использую векторы для обоих направлений и различий между точками.
Итак, определите один тип Vector. Это облегчит вашу жизнь, потому что у вас будет меньше классов и перегруженных операторов / функций для написания и тестирования, и вы будете математически «чище» (если это важно для вас).
На На уровне пуриста я бы сказал, что Вектор
и Точка
не одинаковы, по алгебре:
Точка
+ Вектор
=> Точка
(перевод) Вектор
+ Вектор
=> Вектор
(сложение) Точка
+ 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);
}
}
В .Net> = 3.0 уже есть реализации Point
и Vector
. К сожалению, они находятся в System.Windows.Media.Media3D
, поскольку они являются частью WPF 3D API.
Эти существующие классы действительно обладают некоторыми полезными свойствами, которые делают их достойными изучения (некоторые из них уже упоминались другие):
Точка [+ | -] Вектор = Точка
Вектор [+ | -] Вектор = Вектор
Точка - Точка = Вектор
В векторе
есть статические методы для выполнения точки и пересечения products Vector.Normalise ()
и vector.Negate ()
делают то, что они говорят на банке Может быть, вы могли бы изучить (и даже расширить) их для собственного использования?
Я не рекомендую использовать как Вектор
, так и тип Точка
. Хотя математически они немного отличаются, это различие обычно не дает никаких преимуществ в контексте программирования. Кроме того, вы можете рассматривать точку как вектор от начала координат до местоположения точки.
Я настоятельно рекомендую использовать типы значений вместо ссылочных типов, потому что вы обычно используете векторы так же, как действительные числа, поэтому вы должны нужна та же семантика, что и у числа с плавающей запятой (передача по значению). Если вы выбираете типы значений, помните, что часто лучше сделать их неизменяемыми.
Я также не рекомендую использовать тип Direction
и предпочитаю использовать нормализованные векторы. Вместо трех типов Вектор
, Точка
и Направление
,
Если векторы - это точки, а точки - это векторы, тогда, возможно, они должны быть одного и того же класса (или одного типа структуры).
Или, если вы хотите, чтобы они ...
... затем определяют методы и операторы в базовом классе с помощью защищенного конструктора и определяют Point и Vector как конечные подклассы этот базовый класс, чтобы они унаследовали его функциональность.
Если вы не можете использовать наследование и т. д., чтобы делать именно то, что вы хотите, то скопируйте и вставьте определения операторов в несколько классов, потому что а) Это не проблема обслуживания потому что они вряд ли изменятся б) Вы говорите, что у вас есть веская причина, например: «Я занимаюсь трассировкой лучей, поэтому скорость имеет решающее значение».
Можно сказать, что нет.Это имеет значение, поскольку все они являются векторами, но в C ++ вы можете легко провести различие, так почему бы не C #?
В C # тоже можно различать: C # поддерживает определение отдельных типов и т. д. Две вещи, которые вы можете сделать в C ++, вы не можете в C # использовать шаблоны и глобальные функции с утиным типом, которые могут быть здесь полезны, но не являются необходимыми, если вы вместо этого желаете либо использовать наследование, либо скопировать и вставить общий функционал.
вместо этого мы готовы либо использовать наследование, либо скопировать и вставить общий функционал. вместо этого мы готовы либо использовать наследование, либо скопировать и вставить общий функционал.Я предлагаю определить это как таковое:
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.