Добавлен , опубликован
Моя имплементация векторов (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
37
6 лет назад
0
это есть в DGUI Math без cjass
3
30
6 лет назад
3
Стиль кода, использованный в DGUI подходит только для пыток, на мой взгляд, но не для комфортного использования.
0
37
6 лет назад
Отредактирован ScorpioT1000
0
Clamp, там 1 в 1 как у тебя через .create и остальное, даже методы одинаковые. Только еще есть матрицы и world2win / win2world.
2
30
6 лет назад
Отредактирован Clamp
2
Очень давно не видел сурсы DGUI, возможно, что так и есть. Так или иначе, впервые увидел я их позже, чем написал сабж.

Самое главное, что я там запомнил - это структуры КАПСОМ, хватило для рвотных позывов.

Матрицы мне нужны не были, потому не писал. Думал о кватернионах, но в варкрафте они так и так неюзабельны, ибо к рендеру доступов нет.

как у тебя через .create
Но у меня же через .allocate! :D
0
37
6 лет назад
0
Тогда не было аллокейт вроде
а, немного не так
клак
// DGUI Math by Jon
library Math

function R2I_n takes real r returns integer
    local integer i = R2I(r)
    if (r < I2R(i)+0.5) then
        return i
    else
        return i+1
    endif
endfunction

struct VECTOR3
    static VECTOR3 Zero
    static VECTOR3 oneX
    static VECTOR3 oneY
    static VECTOR3 oneZ
    real x
    real y
    real z
    
    static method New_0 takes nothing returns VECTOR3
        local VECTOR3 this = VECTOR3.create()
        set .x = 0
        set .y = 0
        set .z = 0
        return this
    endmethod
    
    static method New_1 takes real x, real y, real z returns VECTOR3
        local VECTOR3 this = VECTOR3.create()
        set .x = x
        set .y = y
        set .z = z
        return this
    endmethod
    
    static method New_2 takes VECTOR3 v returns VECTOR3
        local VECTOR3 this = VECTOR3.create()
        set .x = v.x
        set .y = v.y
        set .z = v.z
        return this
    endmethod
    
    method SetValues takes real x, real y, real z returns VECTOR3
        set .x = x
        set .y = y
        set .z = z
        return this
    endmethod
    
    method Length takes nothing returns real
        return SquareRoot(.x*.x+.y*.y+.z*.z)
    endmethod
    
    method LengthSq takes nothing returns real
        return .x*.x+.y*.y+.z*.z
    endmethod
    
    method ToString takes nothing returns string
        return "Vector3 id "+I2S(this) + "\nx = "+R2S(.x)+"   y = "+R2S(.y)+"   z = "+R2S(.z)
    endmethod
    
endstruct

function Vec3Add takes VECTOR3 Output, VECTOR3 v1, VECTOR3 v2 returns VECTOR3
    set Output.x = v1.x + v2.x
    set Output.y = v1.y + v2.y
    set Output.z = v1.z + v2.z
    return Output
endfunction

function Vec3Subtract takes VECTOR3 Output, VECTOR3 v1, VECTOR3 v2 returns VECTOR3
    set Output.x = v1.x - v2.x
    set Output.y = v1.y - v2.y
    set Output.z = v1.z - v2.z
    return Output
endfunction
    
function Vec3Scale takes VECTOR3 Output, VECTOR3 v, real r returns VECTOR3
    set Output.x = v.x * r
    set Output.y = v.y * r
    set Output.z = v.z * r
    return Output
endfunction
    
function Vec3Division takes VECTOR3 Output, VECTOR3 v, real r returns VECTOR3
    set Output.x = v.x / r
    set Output.y = v.y / r
    set Output.z = v.z / r
    return Output
endfunction

function Vec3Length takes VECTOR3 v returns real
    return SquareRoot(v.x*v.x+v.y*v.y+v.z*v.z)
endfunction

function Vec3LengthSq takes VECTOR3 v returns real
    return v.x*v.x+v.y*v.y+v.z*v.z
endfunction

function Vec3Normalize takes VECTOR3 Output, VECTOR3 v returns VECTOR3
    local real len = SquareRoot(v.x*v.x+v.y*v.y+v.z*v.z)
    set Output.x = v.x/len
    set Output.y = v.y/len
    set Output.z = v.z/len
    return Output
endfunction

function Vec3Dot takes VECTOR3 v1, VECTOR3 v2 returns real
    return v1.x*v2.x+v1.y*v2.y+v1.z*v2.z
endfunction

function Vec3Cross takes VECTOR3 Output, VECTOR3 v1, VECTOR3 v2 returns VECTOR3
    local real y  = v1.z * v2.x - v1.x * v2.z
    local real z = v1.x * v2.y - v1.y * v2.x
    set Output.x = v1.y * v2.z - v1.z * v2.y
    set Output.y = y
    set Output.z = z
    return Output
endfunction

function Vec3Transform_1 takes VECTOR3 Output, VECTOR3 v, MATRIX3 m returns VECTOR3
    local real y = v.x*m.m12+v.y*m.m22+v.z*m.m32
    local real z = v.x*m.m13+v.y*m.m23+v.z*m.m33
    set Output.x = v.x*m.m11+v.y*m.m21+v.z*m.m31
    set Output.y = y
    set Output.z = z
    return Output
endfunction

function Vec3Transform_2 takes VECTOR3 Output, VECTOR3 v, MATRIX4 m returns VECTOR3
    local real y = v.x*m.m12+v.y*m.m22+v.z*m.m32+m.m42
    local real z = v.x*m.m13+v.y*m.m23+v.z*m.m33+m.m43
    local real w = v.x*m.m14+v.y*m.m24+v.z*m.m34+m.m44
    set Output.x = (v.x*m.m11+v.y*m.m21+v.z*m.m31+m.m41)/w
    set Output.y = y/w
    set Output.z = z/w
    return Output
endfunction


struct MATRIX3
    static MATRIX3 Zero
    static MATRIX3 E
    real m11
    real m12
    real m13
    real m21
    real m22
    real m23
    real m31
    real m32
    real m33
    
    static method New_0 takes nothing returns MATRIX3
        local MATRIX3 this = MATRIX3.create()
        set .m11 = 0
        set .m12 = 0
        set .m13 = 0
        set .m21 = 0
        set .m22 = 0
        set .m23 = 0
        set .m31 = 0
        set .m32 = 0
        set .m33 = 0
        return this
    endmethod
    
    static method New_1 takes real r11, real r12, real r13, real r21, real r22, real r23, real r31, real r32, real r33 returns MATRIX3
        local MATRIX3 this = MATRIX3.create()
        set .m11 = r11
        set .m12 = r12
        set .m13 = r13
        set .m21 = r21
        set .m22 = r22
        set .m23 = r23
        set .m31 = r31
        set .m32 = r32
        set .m33 = r33
        return this
    endmethod
    
    static method New_2 takes MATRIX3 m returns MATRIX3
        local MATRIX3 this = MATRIX3.create()
        set .m11 = m.m11
        set .m12 = m.m12
        set .m13 = m.m13
        set .m21 = m.m21
        set .m22 = m.m22
        set .m23 = m.m23
        set .m31 = m.m31
        set .m32 = m.m32
        set .m33 = m.m33
        return this
    endmethod
    
    method SetValues takes real r11, real r12, real r13, real r21, real r22, real r23, real r31, real r32, real r33 returns MATRIX3
        set .m11 = r11
        set .m12 = r12
        set .m13 = r13
        set .m21 = r21
        set .m22 = r22
        set .m23 = r23
        set .m31 = r31
        set .m32 = r32
        set .m33 = r33
        return this
    endmethod
 
    method ToString takes nothing returns string
        return "Matrux3 id "+I2S(this)+"\n"+R2S(.m11)+"  "+R2S(.m12)+"  "+R2S(.m13)+"\n"+R2S(.m21)+"  "+R2S(.m22)+"  "+R2S(.m23)+"\n"+R2S(.m31)+"  "+R2S(.m32)+"  "+R2S(.m33)
    endmethod
    
endstruct

function Matrix3Multiply takes MATRIX3 Output, MATRIX3 M1, MATRIX3 M2 returns MATRIX3  
    return Output.SetValues(M1.m11*M2.m11+M1.m21*M2.m12+M1.m31*M2.m13,M1.m12*M2.m11+M1.m22*M2.m12+M1.m32*M2.m13,M1.m13*M2.m11+M1.m23*M2.m12+M1.m33*M2.m13,M1.m11*M2.m21+M1.m21*M2.m22+M1.m31*M2.m23,M1.m12*M2.m21+M1.m22*M2.m22+M1.m32*M2.m23,M1.m13*M2.m21+M1.m23*M2.m22+M1.m33*M2.m23,M1.m11*M2.m31+M1.m21*M2.m32+M1.m31*M2.m33,M1.m12*M2.m31+M1.m22*M2.m32+M1.m32*M2.m33,M1.m13*M2.m31+M1.m23*M2.m32+M1.m33*M2.m33)
endfunction

function Matrix3Scaling takes MATRIX3 Output, real x, real y, real z returns MATRIX3
    return Output.SetValues(x,0,0,0,y,0,0,0,z)
endfunction

function Matrix3RotationX takes MATRIX3 Output, real a returns MATRIX3
    return Output.SetValues(1,0,0,0,Cos(a),-Sin(a),0,Sin(a),Cos(a))
endfunction

function Matrix3RotationY takes MATRIX3 Output, real a returns MATRIX3
    return Output.SetValues(Cos(a),0,Sin(a),0,1,0,-Sin(a),0,Cos(a))
endfunction

function Matrix3RotationZ takes MATRIX3 Output, real a returns MATRIX3
    return Output.SetValues(Cos(a),-Sin(a),0,Sin(a),Cos(a),0,0,0,1)
endfunction

function Matrix3RotationAxis takes MATRIX3 Output, VECTOR3 v, real a returns MATRIX3
    local real cosa = Cos(a)
    local real sina = Sin(a)
    return Output.SetValues(cosa+(1-cosa)*v.x*v.x,(1-cosa)*v.x*v.y-sina*v.z,(1-cosa)*v.x*v.z+sina*v.y,(1-cosa)*v.y*v.x+sina*v.z,cosa+(1-cosa)*v.y*v.y,(1-cosa)*v.y*v.z-sina*v.x,(1-cosa)*v.z*v.x-sina*v.y,(1-cosa)*v.z*v.y+sina*v.x,cosa+(1-cosa)*v.z*v.z)
endfunction

function Matrix3RotationYawPitchRoll takes MATRIX3 Output, real Yaw, real Pitch, real Roll returns MATRIX3
    local real cosa = Cos(Yaw)
    local real sina = Sin(Yaw)
    local real cosb = Cos(Pitch)
    local real sinb = Sin(Pitch)
    local real cosy = Cos(Roll)
    local real siny = Sin(Roll)
    return Output.SetValues(cosa*cosb,cosa*sinb*siny-sina*cosy,cosa*sinb*cosy+sina*siny,sina*cosb,sina*sinb*siny+cosa*cosy,sina*sinb*cosy-cosa*siny,-sinb,cosb*siny,cosb*cosy)
endfunction

struct MATRIX4
    static MATRIX4 Zero
    static MATRIX4 E
    real m11
    real m12
    real m13
    real m14
    real m21
    real m22
    real m23
    real m24
    real m31
    real m32
    real m33
    real m34
    real m41
    real m42
    real m43
    real m44
    
    static method New_0 takes nothing returns MATRIX4
        local MATRIX4 this = MATRIX4.create()
        set .m11 = 0
        set .m12 = 0
        set .m13 = 0
        set .m14 = 0
        set .m21 = 0
        set .m22 = 0
        set .m23 = 0
        set .m24 = 0
        set .m31 = 0
        set .m32 = 0
        set .m33 = 0
        set .m34 = 0
        set .m41 = 0
        set .m42 = 0
        set .m43 = 0
        set .m44 = 0
        return this
    endmethod
    
    static method New_1 takes real r11, real r12, real r13, real r14, real r21, real r22, real r23, real r24, real r31, real r32, real r33, real r34, real r41, real r42, real r43, real r44 returns MATRIX4
        local MATRIX4 this = MATRIX4.create()
        set .m11 = r11
        set .m12 = r12
        set .m13 = r13
        set .m14 = r14
        set .m21 = r21
        set .m22 = r22
        set .m23 = r23
        set .m24 = r24
        set .m31 = r31
        set .m32 = r32
        set .m33 = r33
        set .m34 = r34
        set .m41 = r41
        set .m42 = r42
        set .m43 = r43
        set .m44 = r44
        return this
    endmethod
    
    static method New_2 takes MATRIX4 m returns MATRIX4
        local MATRIX4 this = MATRIX4.create()
        set .m11 = m.m11
        set .m12 = m.m12
        set .m13 = m.m13
        set .m14 = m.m14
        set .m21 = m.m21
        set .m22 = m.m22
        set .m23 = m.m23
        set .m24 = m.m24
        set .m31 = m.m31
        set .m32 = m.m32
        set .m33 = m.m33
        set .m34 = m.m34
        set .m41 = m.m41
        set .m42 = m.m42
        set .m43 = m.m43
        set .m44 = m.m44
        return this
    endmethod
    
    static method New_3 takes MATRIX3 m returns MATRIX4
        local MATRIX4 this = MATRIX4.create()
        set .m11 = m.m11
        set .m12 = m.m12
        set .m13 = m.m13
        set .m14 = 0
        set .m21 = m.m21
        set .m22 = m.m22
        set .m23 = m.m23
        set .m24 = 0
        set .m31 = m.m31
        set .m32 = m.m32
        set .m33 = m.m33
        set .m34 = 0
        set .m41 = 0
        set .m42 = 0
        set .m43 = 0
        set .m44 = 1
        return this
    endmethod
    
    method SetValues takes real r11, real r12, real r13, real r14, real r21, real r22, real r23, real r24, real r31, real r32, real r33, real r34, real r41, real r42, real r43, real r44 returns MATRIX4
        set .m11 = r11
        set .m12 = r12
        set .m13 = r13
        set .m14 = r14
        set .m21 = r21
        set .m22 = r22
        set .m23 = r23
        set .m24 = r24
        set .m31 = r31
        set .m32 = r32
        set .m33 = r33
        set .m34 = r34
        set .m41 = r41
        set .m42 = r42
        set .m43 = r43
        set .m44 = r44
        return this
    endmethod
 
    method ToString takes nothing returns string
        return "Matrux4 id "+I2S(this)+"\n"+R2S(.m11)+"  "+R2S(.m12)+"  "+R2S(.m13)+"  "+R2S(.m14)+"\n"+R2S(.m21)+"  "+R2S(.m22)+"  "+R2S(.m23)+"  "+R2S(.m24)+"\n"+R2S(.m31)+"  "+R2S(.m32)+"  "+R2S(.m33)+"  "+R2S(.m34)+"\n"+R2S(.m41)+"  "+R2S(.m42)+"  "+R2S(.m43)+"  "+R2S(.m44)
    endmethod
    
endstruct

function Matrix4Multiply takes MATRIX4 Output, MATRIX4 M1, MATRIX4 M2 returns MATRIX4
    return Output.SetValues(M1.m11*M2.m11+M1.m21*M2.m12+M1.m31*M2.m13+M1.m41*M2.m14,M1.m12*M2.m11+M1.m22*M2.m12+M1.m32*M2.m13+M1.m42*M2.m14,M1.m13*M2.m11+M1.m23*M2.m12+M1.m33*M2.m13+M1.m43*M2.m14,M1.m14*M2.m11+M1.m24*M2.m12+M1.m34*M2.m13+M1.m44*M2.m14,M1.m11*M2.m21+M1.m21*M2.m22+M1.m31*M2.m23+M1.m41*M2.m24,M1.m12*M2.m21+M1.m22*M2.m22+M1.m32*M2.m23+M1.m42*M2.m24,M1.m13*M2.m21+M1.m23*M2.m22+M1.m33*M2.m23+M1.m43*M2.m24,M1.m14*M2.m21+M1.m24*M2.m22+M1.m34*M2.m23+M1.m44*M2.m24,M1.m11*M2.m31+M1.m21*M2.m32+M1.m31*M2.m33+M1.m41*M2.m34,M1.m12*M2.m31+M1.m22*M2.m32+M1.m32*M2.m33+M1.m42*M2.m34,M1.m13*M2.m31+M1.m23*M2.m32+M1.m33*M2.m33+M1.m43*M2.m34,M1.m14*M2.m31+M1.m24*M2.m32+M1.m34*M2.m33+M1.m44*M2.m34,M1.m11*M2.m41+M1.m21*M2.m42+M1.m31*M2.m43+M1.m41*M2.m44,M1.m12*M2.m41+M1.m22*M2.m42+M1.m32*M2.m43+M1.m42*M2.m44,M1.m13*M2.m41+M1.m23*M2.m42+M1.m33*M2.m43+M1.m43*M2.m44,M1.m14*M2.m41+M1.m24*M2.m42+M1.m34*M2.m43+M1.m44*M2.m44)
endfunction

function Math_Init takes nothing returns nothing
   set VECTOR3.Zero = VECTOR3.New_0()
   set VECTOR3.oneX = VECTOR3.New_1(1,0,0)
   set VECTOR3.oneY = VECTOR3.New_1(0,1,0)
   set VECTOR3.oneZ = VECTOR3.New_1(0,0,1)
   set MATRIX3.Zero = MATRIX3.New_0()
   set MATRIX3.E = MATRIX3.New_1(1,0,0,0,1,0,0,0,1)
   set MATRIX4.Zero = MATRIX4.New_0()
   set MATRIX4.E = MATRIX4.New_1(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)
endfunction

endlibrary
4
30
6 лет назад
4
ScorpioT1000, ну блин, апи же ужасное! Эти VECTOR3.New_0/1/2, как с этим нормально работать?

Плюс у меня деление на число оптимальнее реализовано =Р
Одна операция деления и три умножения против трёх операций деления
0
37
6 лет назад
0
Clamp, деление не так много жрёт как лишний вызов функции
0
30
6 лет назад
Отредактирован Clamp
0
ScorpioT1000, помню, что специально изучал этот вопрос и даже раскладывал модель на низком уровне, чтобы выяснить как оно точно работает. Выходило, что вызов функции для экономии двух делений выгоднее, хотя, конечно, говорить о драматическом росте производительности тут нельзя никаким образом. Это относится только к Vec3, в Vec2 замена деления на умножение с вызовом давали в рассчёте очень-очень небольшой, но оверхед, однако оставил для consistency.

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

Вопрос: стоит ли закинуть в Warcraft, или пусть здесь будет?
8
29
6 лет назад
8
normalize не хендлит вектор нулевой длины, имена plus/minus вместо общепринятых и более консистентных add/sub, radius (какой радиус у вектора? у него длина). Умножение вектора на число чаще называют scale.
0
37
6 лет назад
0
Стоит закинуть в варкрафт, в блогах никто никогда не ищет
0
30
6 лет назад
0
Doc, здравые комментарии. Радиус поэтому, но тоже здравое замечание.

Каким образом принято хандлить нормализацию нулевого вектора?

Учёл все замечания, кроме нулевого вектора пока что.
0
29
6 лет назад
0
Как минимум в девелопер режиме принтить ошибку.
0
30
6 лет назад
0
Полагал, что помимо этого есть какой-нибудь общий подход типа "вернуть сам вектор". Добавил вывод ошибки при включенном дебаге.
0
29
6 лет назад
0
Где Vec4 с параметрами ct, x, y, z?
Мне интересно применение 4D в варике.. (Псевдо 4-мерного пространства)
0
30
6 лет назад
Отредактирован Clamp
0
Инструменты делают для того, чтобы закрывать конкретные потребности, а не для того, чтобы делать инструменты.
0
37
6 лет назад
Отредактирован ScorpioT1000
0
Дело в том, что нулевой вектор - это вектор без направления по определению. Нормаль - это вектор по сумме с единицей по определению. Нельзя нарушить любое из этих правил. Оставь деление на ноль, лишняя проверка только перегрузит вц3.
Либо можно в дебаг моде поставить иф, но если это точно выпилится вместе с проверкой
3
29
6 лет назад
3
Возвращать другой вектор - рецепт для еще большего числа ошибок. Нужна просто возможность этот баг поймать, то же самое, что вжасс пишет про double free.
0
30
6 лет назад
0
Либо можно в дебаг моде поставить иф, но если это точно выпилится вместе с проверкой
Там так и реализовано.
Я знаю, что такое нулевой вектор и что такое нормаль, само собой. Лично у меня никогда не возникало потребности в этой проверке на корректность, но для общего случая дебаг там действительно полезен.

Возвращать другой вектор - рецепт для еще большего числа ошибок. Нужна просто возможность этот баг поймать, то же самое, что вжасс пишет про double free.
Ну да, это понятно, просто высказал предположение, не более.
4
30
6 лет назад
4
Залили в ресурсы WC3, пользуйтесь на здоровье!
0
28
6 лет назад
Отредактирован PT153
0
Не понимаю этой моды на вычисление длины методом. Почему нельзя её вычислить 1 раз во время создания вектора, записав в переменную, и менять её только в том случае, если вектор был изменён?

Хотят тут, конечно, зависит от использования. Если я часто буду изменять векторы, и редко брать длину, то тогда лучше длину каждый раз считать. Если наоборот, то тогда лучше рассчитывать только при создании и изменении вектора. Я бы вообще сделал вектор неизменяемым.
0
37
6 лет назад
0
PT153, лишняя память. Вектор - такой объект, который может создаваться миллионами единиц (в варкрафте нет).
0
30
6 лет назад
0
Я бы вообще сделал вектор неизменяемым.
И пересоздавал каждый раз? Это ещё тяжелее может оказаться. Кроме того, длинна может вообще быть не нужна в системе, и будет храниться мёртвым грузом.

в варкрафте нет
Когда делал демку физики, доводил до 3к физических объектов, в пике нагрузки жило до 4к векторов, так что даже в варкрафте можно ощутимый импакт на потребление памяти увидеть.
2
37
6 лет назад
2
Ну вон xcoll / xdestr вроде всегда хранит и передаёт 3 коорды, чтобы было ещё легче (локалки быстрее глобалок и быстрее обращений к массиву)
11
4
6 лет назад
11
Опять один бородатый программист написал никому не нужную фигню, чтобы обсудить это с двумя другими бородатыми программистами, которые занимаются той же ахинеей.
0
27
6 лет назад
0
abidin, это ты конечно зря сейчас сказал, хоть и частично правда.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.