Векторы

Published
Моя имплементация векторов (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;
    }
}


Views: 12 172

» Лучшие комментарии


ScorpioT1000 #53 - 3 years ago 0
Голосов: +0 / -0
cjass - надстройка над vjass
GetLocalPlayer #54 - 3 years ago 0
Голосов: +0 / -0
Что делает его только хуже. Например, когда появляются вопросы с нечитабельной мешаниной из vJass и cJass.
ScorpioT1000 #55 - 3 years ago (изм. ) 2
Голосов: +2 / -0
GetLocalPlayer, c++ не делает c хуже. Вопрос криворукости.
GetLocalPlayer #56 - 3 years ago 2
Голосов: +2 / -0
C++ не изменяет синтакцис объявления блоков кода, переменных, функций. Он не изменяет синтаксис языка кардинально, но дополняет его, поэтому он не делает его хуже.
cJass - полная противоположность vJass, не имеющая с ним ничего общего, при этом допускающая свое смешение. Это делает его хуже. Очень сильно хуже.
ScorpioT1000 #57 - 3 years ago 0
Голосов: +0 / -0
C++ не изменяет синтакцис объявления блоков кода, переменных, функций. Он не изменяет синтаксис языка кардинально, но дополняет его, поэтому он не делает его хуже.
Ясно, дальнейший диалог вести не вижу смысла))
Doc #58 - 3 years ago (изм. ) 4
Голосов: +4 / -0
У вурст есть одна проблема: это неизвестный ЯП, который никоим боком, кроме либы, не относится ни к warcraft 3, ни к чему угодно вне warcraft 3
Напомните мне, как это вообще является проблемой для кого угодно, кроме полных новичков? У меня не возникло никаких проблем с синтаксисом, когда я писал на вурсте, напротив, там есть много интересных фич (та же двойная точка как в дарте), которых не хватает в других языках
Clamp #59 - 3 years ago 0
Голосов: +0 / -0
GetLocalPlayer, концепция cJass была в реализации возможности использовать синтаксис C, не более.
voix2ciel #60 - 3 years ago 0
Голосов: +0 / -0
ScorpioT1000:
У вурст есть одна проблема: это неизвестный ЯП, который никоим боком, кроме либы, не относится ни к warcraft 3, ни к чему угодно вне warcraft 3
Что значит "неизвестный ЯП"? Это худший аргумент. Мне, как js погромисту, wurst кажется простым и понятным даже в случае вещей, которых нет в js. Он реализует большинство современных возможностей "нормальных" ЯП, поэтому как он может быть "неизвестным", если в нем буквально все уже известно и используется в программировании в целом? Есть еще придирки к синтаксису, но это даже слушать скучно. Это шикарный инструмент, который дает возможность писать с использованием конструкций высокоуровневых яп на изначально сильно ограниченном jass'е при этом используя нормальный редактор. И в нем нет ничего неизвестного. От слова совсем. И знания, полученные малоопытными картоделами при использовании данного инструмента, являются полезными знаниями, которые пригодятся почти в любом ооп-ориентированом ЯП.
ScorpioT1000 #61 - 3 years ago 0
Голосов: +0 / -0
voix2ciel, давай список публично известных либ на гитхабе. Хотябы реализация матриц/кватернионов есть где-то?
Люблю вот я таких жс погромистов)
voix2ciel #62 - 3 years ago 2
Голосов: +2 / -0
ScorpioT1000, ты сейчас серьезно? Ты действительно считаешь это уместным аргументом в данном контексте? Что неизвестного в данном инструменте? Что делает его изучение бессмысленным? Если человек не знает конструкций современных яп, то при изучении данного яп, он изучит и часть этих конструкций, это пойдет человеку на пользу, он лучше начнет понимать саму концепцию современного программирования. Если знает, то и wurst для него покажется знакомым, простым и понятным, а синтаксис является темой для холиваров, но не для серьезных обсуждений, особенно в случае, когда выбора практически нет. Это именно то, о чем я писал выше. При чем тут сторонние библиотеки и реализации каких-то там кватернионов? Ты о чем? Какие нафиг квартерионы?
ScorpioT1000 #63 - 3 years ago 0
Голосов: +0 / -0
Тем, что в 2018 никто не пишет велосипеды :((
Doc #64 - 3 years ago 5
Голосов: +5 / -0
давай список публично известных либ на гитхабе. Хотябы реализация матриц/кватернионов есть где-то?
Господи, какой высосанный из пальца поинт. Матрицы и кватернионы просто НЕ НУЖНЫ в абсолютном большинстве модов в принципе. Мало того, что не нужны, так еще и эта математика пишется на коленке за МИНУТЫ. Хоть бы придумали что посерьезнее. Ох вейт, в вжассе нет ни одной мастхев либы, которая бы юзалась в каждой жасс карте, потому что все пишется с нуля. Зато в каждой теме вопросы КАК ПОЛУЧИТЬ АТАКУ ЮНИТА. Внезапно, вурст позволяет генерить дефинишны юниты и заполнять таблицы статов прямо в коде, компайл тайм экзекушн, емае. А еще поддерживает нормальный тулинг и юнит тесты. Нет, хотим жрать говно. Ну жрите, боже! Только доказывать, что это конфета не нужно.
ScorpioT1000 #65 - 3 years ago 0
Голосов: +0 / -0
Doc, если бы щас вышел хьюдж патч для вц3 и сделал его современным, представим, ты бы захотел замутить карту для него с топ солюшнами.
Ты бы писал всё с нуля на вурсте или взял ряд готовых решений и не тратил время на это дерьмо?
Ты, блэд, как софт то в жизни пишешь, антипаттерн, блин, ходячий?))
abidin #66 - 3 years ago 7
Голосов: +7 / -0
Тем временем заметим, что тут обсуждают что угодно, но только не векторы.
Ярг Восьмой #67 - 3 years ago (изм. ) 0
Голосов: +0 / -0
abidin, это вполне нормально, а я вот свои написал... пока вожусь с математикой цветов
Они удобны только для манипуляции с цветами. Хотя я их вообще не использую в координатах.
» code
 globals
        board   PartyTable      = 0
        rgb     PartyTableColor = 0
        rgb     RGBYellow       = 0
        rgb     RGBGray         = 0
        rgb     RGBLime         = 0
        rgb     RGBAmaranth     = 0
        rgb     RGBDarkRed      = 0
        rgb     RGBPlatinumGray = 0
        rgb     RGBScarlet      = 0
        rgb     RGBGold         = 0
        rgb     RGBMiddleBlue   = 0
        rgb     RGBBrightGreen  = 0
        integer PTId            = 0
    endglobals
    
    function InitRGBColors takes nothing returns nothing
        set PartyTableColor = rgb.create( 15, 127, 255 )
        set RGBYellow       = rgb.create( 255, 255, 0 )
        set RGBLime         = rgb.create( 0, 255, 0 )
        set RGBGray         = rgb.create( 128, 128, 128 )
        set RGBAmaranth     = rgb.create( 229, 43, 80 )
        set RGBDarkRed      = rgb.create( 139, 0, 0 )
        set RGBPlatinumGray = rgb.create( 127, 118, 121 )
        set RGBScarlet      = rgb.create( 255, 36, 121 )
        set RGBGold         = rgb.create( 255, 215, 0 )
        set RGBMiddleBlue   = rgb.create( 66, 170, 255 )
        set RGBBrightGreen  = rgb.create( 102, 155, 0 )
    endfunction
НЗМ: Я вот жду, когда тут 4D векторы появятся.
Doc #68 - 3 years ago 0
Голосов: +0 / -0
Ты бы писал всё с нуля на вурсте или взял ряд готовых решений и не тратил время на это дерьмо?
Еще раз спрошу: каких решений? Покажите мне мастхев библиотеки в вц3. Да даже в д2. Их просто нет.
abidin #69 - 3 years ago 0
Голосов: +0 / -0
KingMaximax, Да, только вот арифметика не нужна для тебя. Только Get/Set/Copy/Clear/Create/Random
И ты сам можешь дополнить одной переменной alpha, если удалить арифметические функции .
Sergarr #70 - 3 years ago 2
Голосов: +2 / -0
PT153:
Тоад и диод
Ой, а кто это?
"Тоад" это Toadcop, он написал самую, по моему личному мнению, крутую из всех завершенных карт на ХГМ, TcX. Диод это DioD, он очень хорошие советы по JASS-у давал, когда еще был здесь.
Raised #71 - 3 years ago (изм. ) -1
Голосов: +0 / -1
Офигенно полезно, конечно. Человекам нужна нормальная статья, потому что без знаний это все равно применить не смогут, а со знаниями - не смогут вкурить накой нужна такая банальщина.
nvc123 #72 - 3 years ago 1
Голосов: +1 / -0
Raised, это наработка а не статья
она нужна чтобы человеки со знанием не тратили своё время на написание этого
Raised #73 - 3 years ago -1
Голосов: +0 / -1
Оке. Убедил. Может даже час сэкономит.