Добавлен , опубликован
Моя имплементация векторов (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;
    }
}
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
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
Напомните мне, как это вообще является проблемой для кого угодно, кроме полных новичков? У меня не возникло никаких проблем с синтаксисом, когда я писал на вурсте, напротив, там есть много интересных фич (та же двойная точка как в дарте), которых не хватает в других языках
0
30
6 лет назад
0
GetLocalPlayer, концепция cJass была в реализации возможности использовать синтаксис C, не более.
0
1
6 лет назад
0
ScorpioT1000:
У вурст есть одна проблема: это неизвестный ЯП, который никоим боком, кроме либы, не относится ни к warcraft 3, ни к чему угодно вне warcraft 3
Что значит "неизвестный ЯП"? Это худший аргумент. Мне, как js погромисту, wurst кажется простым и понятным даже в случае вещей, которых нет в js. Он реализует большинство современных возможностей "нормальных" ЯП, поэтому как он может быть "неизвестным", если в нем буквально все уже известно и используется в программировании в целом? Есть еще придирки к синтаксису, но это даже слушать скучно. Это шикарный инструмент, который дает возможность писать с использованием конструкций высокоуровневых яп на изначально сильно ограниченном jass'е при этом используя нормальный редактор. И в нем нет ничего неизвестного. От слова совсем. И знания, полученные малоопытными картоделами при использовании данного инструмента, являются полезными знаниями, которые пригодятся почти в любом ооп-ориентированом ЯП.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.