Добавлен , опубликован
Моя имплементация векторов (2D и 3D) с полным набором инструментария для работы с ними.

Исходники в тексте:
Vec2
struct Vec2 {
    public float x, y;

    public Vec2 setVal(float x, float y) {
        this.x = x;
        this.y = y;
        return this;
    }

    public Vec2 clear() {
        return this.setVal(0.0, 0.0);
    }

    // Constructors
    public static Vec2 create() {
        return Vec2.allocate().setVal(0.0, 0.0);
    }

    public static Vec2 createAt(float x, float y) {
        return Vec2.allocate().setVal(x, y);
    }

    public static Vec2 createRandom() {
        return Vec2.allocate().setVal(GetRandomReal(-1.0, 1.0), GetRandomReal(-1.0, 1.0));
    }

    // Transitional behavior
    public Vec2 clone() {
        return Vec2.allocate().setVal(this.x, this.y);
    }

    public Vec2 copy(Vec2 another) {
        return this.setVal(another.x, another.y);
    }

    // Math
    public Vec2 add(Vec2 another) {
        return this.setVal(this.x + another.x, this.y + another.y);
    }

    public Vec2 sub(Vec2 another) {
        return this.setVal(this.x - another.x, this.y - another.y);
    }

    public Vec2 scale(float number) {
        return this.setVal(this.x*number, this.y*number);
    }

    public Vec2 div(float number) {
        return this.scale(1.0/number);
    }

    public float dot(Vec2 another) {
        return this.x*another.x + this.y*another.y;
    }

    public float lengthSqr() {
        return this.x*this.x + this.y*this.y;
    }

    public float length() {
        return SquareRoot(this.x*this.x + this.y*this.y);
    }

    public float distToSqr(Vec2 another) {
        return (this.x - another.x)*(this.x - another.x) + (this.y - another.y)*(this.y - another.y);
    }

    public float distTo(Vec2 another) {
        return SquareRoot(this.distToSqr(another));
    }

    public float angle(Vec2 another) {
        return Acos(this.dot(another)/this.length()*another.length());  // radians
    }

    public Vec2 normalize() {
        debug if (this.length == 0.0) { BJDebugMsg("attempt to normalize vector with zero length"); return this; }
        return this.scale(1.0/this.length());
    }

    // Misc.
    public Vec2 reflect(Vec2 normal) {
        Vec2 temp = normal.clone().scale(2.0*this.dot(normal));
        this.sub(temp);
        temp.destroy();
        return this;
    }
}
Vec3
struct Vec3 {
    public float x, y, z;

    public Vec3 setVal(float x, float y, float z) {
        this.x = x;
        this.y = y;
        this.z = z;
        return this;
    }

    public Vec3 clear() {
        return this.setVal(0.0, 0.0, 0.0);
    }

    // Constructors
    public static Vec3 create() {
        return Vec3.allocate().setVal(0.0, 0.0, 0.0);
    }

    public static Vec3 createAt(float x, float y, float z) {
        return Vec3.allocate().setVal(x, y, z);
    }

    public static Vec3 createRandom() {
        return Vec3.allocate().setVal(GetRandomReal(-1.0, 1.0), GetRandomReal(-1.0, 1.0), GetRandomReal(-1.0, 1.0));
    }

    // Transitional behavior
    public Vec3 clone() {
        return Vec3.allocate().setVal(this.x, this.y, this.z);
    }

    public Vec3 copy(Vec3 another) {
        return this.setVal(another.x, another.y, another.z);
    }

    // Math
    public Vec3 add(Vec3 another) {
        return this.setVal(this.x + another.x, this.y + another.y, this.z + another.z);
    }

    public Vec3 sub(Vec3 another) {
        return this.setVal(this.x - another.x, this.y - another.y, this.z - another.z);
    }

    public Vec3 scale(float number) {
        return this.setVal(this.x*number, this.y*number, this.z*number);
    }

    public Vec3 div(float number) {
        return this.scale(1.0/number);
    }

    public float dot(Vec3 another) {
        return this.x*another.x + this.y*another.y + this.z*another.z;
    }

    public float lengthSqr() {
        return this.x*this.x + this.y*this.y + this.z*this.z;
    }

    public float length() {
        return SquareRoot(this.x*this.x + this.y*this.y + this.z*this.z);
    }

    public float distToSqr(Vec3 another) {
        return (this.x - another.x)*(this.x - another.x) + (this.y - another.y)*(this.y - another.y) + (this.z - another.z)*(this.z - another.z);
    }

    public float distTo(Vec3 another) {
        return SquareRoot(this.distToSqr(another));
    }

    public float angle(Vec3 another) {
        return Acos(this.dot(another)/this.length()*another.length());
    }

    public Vec3 normalize() {
        debug if (this.length == 0.0) { BJDebugMsg("attempt to normalize vector with zero length"); return this; }
        return this.scale(1.0/this.length());
    }

    public static Vec3 cross(Vec3 edge1, Vec3 edge2) {
        return Vec3.createAt(edge1.y*edge2.z - edge1.z*edge2.y, edge1.z*edge2.x - edge1.x*edge2.z, edge1.x*edge2.y - edge1.y*edge2.x);
    }

    // Misc.
    public Vec3 reflect(Vec3 normal) {
        Vec3 temp = normal.clone().scale(2.0*this.dot(normal));
        this.sub(temp);
        temp.destroy();
        return this;
    }

    public static Vec3 triangleNormal(Vec3 a, Vec3 b, Vec3 c) {
        Vec3 edge1 = b.clone().sub(a);
        Vec3 edge2 = c.clone().sub(a);
        Vec3 result = Vec3.cross(edge1, edge2).normalize();
        edge1.destroy();
        edge2.destroy();
        return result;
    }
}
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
30
6 лет назад
Отредактирован Clamp
0
"> и != генерируются автоматически на основе их обратных эквивалентов.
А что, они при этом не перегружаются? К чему это уточнение?

Подразумевалось повседневное использование, скажем, вместо глобалок X/Y для координат юнита.
Юзайте Location, оно как раз для этого было введено. Векторы нужны для описания движения (хотя, надо сказать, что все юниты, которых я передвигал, двигались вдоль векторов). Вообще могу поискать свою демку физики, там всё ну очень просто, и никаких проблем с использованием этих векторов не было.

Никто здесь не делал претензий на то, что пишет свой язык, (вурст говно кстати в плане удобства синтаксиса).
0
29
6 лет назад
Отредактирован Doc
0
К чему это уточнение?
К тому что разные реализации < и > написать нельзя.
Юзайте Location, оно как раз для этого было введено
Глупый вывод, локейшн это хендл, не все нативки его принимают, занимает время на создание.
В вурсте с синтаксисом все замечательно, не знаю, откуда такие новости. Питон считается одним из топовых языков в плане синтаксиса
и никаких проблем с использованием этих векторов не было.
С тем же успехом можно сказать, что у Жона в ДГУИ тоже никаких проблем не было, зачем эта либа тогда?
2
17
6 лет назад
Отредактирован GetLocalPlayer
2
А что, они при этом не перегружаются? К чему это уточнение?
Doc, уже ответил, контроля нет.
Clamp:
Юзайте Location, оно как раз для этого было введено.
Что не отличается от неудобств использования вектора. Как уже сказал Doc, не все функции принимают Location. Более того, использовать его нисколько не удобно, из-за необходимости вызова сторонней функции для получения хранящихся в нём данных и хуже всего, это хэндл, который надо уничтожать (подобно векторам) и обнулять.
Clamp:
Никто здесь не делал претензий на то, что пишет свой язык, (вурст говно кстати в плане удобства синтаксиса).
Это вкусавщина. Тебе удобно упираться в фигурные скобки и писанину function/takes/returns/endfunction, а кому-то нужна краткость и объективность.
Что отрицать не получится, что Wurst - единственный полноценный компилятор не брошенный разработчиком, с самым широким спектром возможностей супротив его предшественникам.
2
37
6 лет назад
Отредактирован ScorpioT1000
2
У вурст есть одна проблема: это неизвестный ЯП, который никоим боком, кроме либы, не относится ни к warcraft 3, ни к чему угодно вне warcraft 3
0
17
6 лет назад
Отредактирован GetLocalPlayer
0
То же можно сказать о cJass, но это никого не смущает.
0
37
6 лет назад
0
cjass - надстройка над vjass
0
17
6 лет назад
0
Что делает его только хуже. Например, когда появляются вопросы с нечитабельной мешаниной из vJass и cJass.
3
37
6 лет назад
Отредактирован ScorpioT1000
3
GetLocalPlayer, c++ не делает c хуже. Вопрос криворукости.
4
17
6 лет назад
4
C++ не изменяет синтакцис объявления блоков кода, переменных, функций. Он не изменяет синтаксис языка кардинально, но дополняет его, поэтому он не делает его хуже.
cJass - полная противоположность vJass, не имеющая с ним ничего общего, при этом допускающая свое смешение. Это делает его хуже. Очень сильно хуже.
0
37
6 лет назад
0
C++ не изменяет синтакцис объявления блоков кода, переменных, функций. Он не изменяет синтаксис языка кардинально, но дополняет его, поэтому он не делает его хуже.
Ясно, дальнейший диалог вести не вижу смысла))
4
29
6 лет назад
Отредактирован Doc
4
У вурст есть одна проблема: это неизвестный ЯП, который никоим боком, кроме либы, не относится ни к warcraft 3, ни к чему угодно вне warcraft 3
Напомните мне, как это вообще является проблемой для кого угодно, кроме полных новичков? У меня не возникло никаких проблем с синтаксисом, когда я писал на вурсте, напротив, там есть много интересных фич (та же двойная точка как в дарте), которых не хватает в других языках
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.