vect X vect?
От: Аноним  
Дата: 30.05.06 08:34
Оценка:
Добрый день!

Можно ли ввести операцию векторного произведения векторов и обозначить ее как принятов в математике но вместо креста взять X. Пока сделал + вроде работаети но не красиво как то.

class vector3D {
public:

  point3D M1;
  point3D M2;


  vector3D()  {
     M1=point3D(0,0,0);
     M2=point3D(0,0,0);
  }

  vector3D(point3D _M1, point3D _M2)  {
     M1=_M1;
     M2=_M2;
  }

  double operator*(vector3D &A){
     return
        (this->M2.x-this->M1.x)*(A.M2.x-A.M1.x)+
        (this->M2.y-this->M1.y)*(A.M2.y-A.M1.y)+
        (this->M2.z-this->M1.z)*(A.M2.z-A.M1.z)
     ;
  }



  vector3D operator+ (vector3D &A){
     return  vector3D
     (
        point3D(this->M1),
        point3D
        (
          (this->M2.y-this->M1.y)*(A.M2.z-A.M1.z)-(A.M2.y-A.M1.y)*(this->M2.z-this->M1.z),
          (this->M2.z-this->M1.z)*(A.M2.x-A.M1.x)-(A.M2.z-A.M1.z)*(this->M2.x-this->M1.x),
          (this->M2.x-this->M1.x)*(A.M2.y-A.M1.y)-(A.M2.x-A.M1.x)*(this->M2.y-this->M1.y)
        )
     );
  }


};
Re: vect X vect?
От: korzhik Россия  
Дата: 30.05.06 08:45
Оценка: 1 (1) +1
Здравствуйте, Аноним, Вы писали:

А>Добрый день!


А>Можно ли ввести операцию векторного произведения векторов и обозначить ее как принятов в математике но вместо креста взять X. Пока сделал + вроде работаети но не красиво как то.


хм... ну только не плюс.
Можно так сделать:
  c = a * b; // dot product
  d = a ^ b; // cross product
Re[2]: vect X vect?
От: Аноним  
Дата: 30.05.06 08:51
Оценка:
Здравствуйте, korzhik, Вы писали:

K>Здравствуйте, Аноним, Вы писали:


А>>Добрый день!


А>>Можно ли ввести операцию векторного произведения векторов и обозначить ее как принятов в математике но вместо креста взять X. Пока сделал + вроде работаети но не красиво как то.


K>хм... ну только не плюс.

K>Можно так сделать:
K>
K>  c = a * b; // dot product
K>  d = a ^ b; // cross product
K>


Так + по приоритету и ассоциативности поближе бедет, если учесть что * задействована.
То есть нужно
[code]
std::cout << Vect1 + Vect2
std::cout << ( Vect1 ^ Vect2)
[code]

Хотя если + потребуется придется ...
Re: vect X vect?
От: Aera Беларусь  
Дата: 30.05.06 08:53
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Добрый день!


А>Можно ли ввести операцию векторного произведения векторов и обозначить ее как принятов в математике но вместо креста взять X. Пока сделал + вроде работаети но не красиво как то.


Нельзя.

С операторами вообще проблема. В таком как у тебя случае, когда нет явной аналоги между операторами, лучше вообще ими не пользоваться, иначе быстро возникнет путаница. Я бы порекоммендовал воспользоваться функциями.

double scalar_mult(Vector3D, Vector3D);
Vector3D vector_mult(Vector3D, Vector3D);

Не очень красиво, зато предотвращает ошибки.


Хотя нет, еще придумал способ:
class scalar_t { ... };
extern scalar_t scalar;

class vector_t {...};
extern vector_t vector;

int main()
{
  Vector3D a, b;
  double value = scalar * a * b;
  Vector3D c = vector * a * b;
}
--
RedApe
Re: vect X vect?
От: Аноним  
Дата: 30.05.06 08:54
Оценка: :)))
Здравствуйте, Аноним, Вы писали:

А>Добрый день!


А>Можно ли ввести операцию векторного произведения векторов и обозначить ее как принятов в математике но вместо креста взять X. Пока сделал + вроде работаети но не красиво как то.


Добавь в начало файла:

#define x +

Только переменные 'x' не называй
Re[3]: vect X vect?
От: Centaur Россия  
Дата: 30.05.06 09:36
Оценка: 2 (2) +1
Здравствуйте, Аноним, Вы писали:

А>Так + по приоритету и ассоциативности поближе бедет, если учесть что * задействована.


Человек, который увидит в коде v1 + v2, будет предполагать, что это сложение векторов покоординатно. И когда он узнает, что это на самом деле векторное произведение, он тебя побьёт. И будет прав.
Re: vect X vect?
От: Кодт Россия  
Дата: 30.05.06 10:21
Оценка: 24 (5)
Здравствуйте, Аноним, Вы писали:

Во-первых, "+" имеет самостоятельный смысл (поэлементное сложение векторов).
Во-вторых, умножение бывает — поэлементным, скалярным, векторным. Поэтому перегрузка "*" не очень оправдана.
Что можно предложить?
// новые операторы
#define PPROD *pprod_tag* // поэлементное
#define XPROD *xprod_tag* // векторное (cross-product)
#define SPROD *sprod_tag* // скалярное

// тэги
enum pprod_tag_t { pprod_tag };
enum xprod_tag_t { xprod_tag };
enum sprod_tag_t { sprod_tag };

// связка тэга и значения
template<class V, class T>
class tagged
{
  const V& v_;
public:
  tagged(const V& v) : v_(v) {}
  const V& get() const { return v_; }
};

// умножение первого аргумента на тэг...
template<class V> tagged<V,pprod_tag_t> operator* (const V& vl, pprod_tag_t) { return v; }
template<class V> tagged<V,xprod_tag_t> operator* (const V& vl, xprod_tag_t) { return v; }
template<class V> tagged<V,sprod_tag_t> operator* (const V& vl, sprod_tag_t) { return v; }

// умножение связки на второй агрумент превращается в вызов соответствующей функции
template<class V> V                     operator* (tagged<V,pprod_tag_t> vl, const V& vr) { return polyproduct  (vl.get(), vr); }
template<class V> V                     operator* (tagged<V,xprod_tag_t> vl, const V& vr) { return crossproduct (vl.get(), vr); }
template<class V> typename V::item_type operator* (tagged<V,sprod_tag_t> vl, const V& vr) { return scalarproduct(vl.get(), vr); }

/////////////////////////////////

// выражения записываются так:
(v1 PPROD v2 + v3 XPROD v4) SPROD v5

Кстати, в тензорном исчислении смысл скалярного и векторного умножений меняется (обобщается), поэтому можно было бы написать
template<class A, class B>
  typename tensor_op_traits<A,B>::cross_type
    operator* (tagged<A,xprod_tag_t> vl, const B& vr) { return crossproduct(vl.get(), vr); }
Перекуём баги на фичи!
Re[2]: vect X vect?
От: VoidEx  
Дата: 30.05.06 18:42
Оценка: +1 :)
Здравствуйте, Aera, Вы писали:

A>Хотя нет, еще придумал способ:

A>
A>class scalar_t { ... };
A>extern scalar_t scalar;

A>class vector_t {...};
A>extern vector_t vector;

A>int main()
A>{
A>  Vector3D a, b;
A>  double value = scalar * a * b;
A>  Vector3D c = vector * a * b;
A>}
A>


=)
Или

int main()
{
  Vector3D a, b;
  double value = scalar(a * b);
  Vector3D c = vector(a * b);
}

=)
Re[3]: vect X vect?
От: kan_izh Великобритания  
Дата: 30.05.06 19:25
Оценка:
VoidEx wrote:

> {

> Vector3D a, b;
> double value = scalar(a * b);
> Vector3D c = vector(a * b);
> }
Это уже лажа, ибо уж проще заменить * на , и записать тривиальное scalar(a,b)
А вот записывать инфиксные операторы в виде:
c = a <vector> b <scalar> z;

может быть даже красяво...
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: vect X vect?
От: Кодт Россия  
Дата: 31.05.06 09:01
Оценка:
Здравствуйте, kan_izh, Вы писали:

_>Это уже лажа, ибо уж проще заменить * на , и записать тривиальное scalar(a,b)

_>А вот записывать инфиксные операторы в виде:
_>
_>c = a <vector> b <scalar> z;
_>

_>может быть даже красяво...

Неудобняк-с, по причине низкого приоритета операторов < и >. Придётся лепить скобки вокруг.

Оператор , тоже (на мой взгляд) не лучший выбор, потому что:
1) Он определён по умолчанию, и это умолчание синтаксически корректно (имеет тип последнего аргумента), а семантически совсем другое. То есть компилятор не заругается, если ты ошибёшься.
2) Смысл лексемы , перегружен (это не только оператор, но и разделитель в списках аргументов). Читаемость программы пострадает.

Кстати, можно задействовать оператор %.
1) Он также мультипликативный, то есть лишних скобок не надо.
2) Дефолтная семантика (остаток от деления), как и у векторного умножения — некоммутативна. (Векторное умножение — антикоммутативно, a×b = -b×a).
Перекуём баги на фичи!
Re: vect X vect?
От: Olivan Россия  
Дата: 31.05.06 09:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Можно ли ввести операцию векторного произведения векторов и обозначить ее как принятов в математике но вместо креста взять X. Пока сделал + вроде работаети но не красиво как то.


как вариант — можно использовать прокси-класс с операторами приведения к типу, для "перегрузки" по возвращаемому значению.


int main() {
    Vector3D a, b;
    double value = a * b;  // proxy::operator double
    Vector3D c = a * b;    // proxy::operator Vector3D &
}
Re: vect X vect?
От: minorlogic Украина  
Дата: 31.05.06 09:45
Оценка: 2 (2) +2
Очень советую просто использовать функции

dot()
cross()

После многолетних экспериментов пришел к выводу что это лучше читается и пишется .
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[5]: vect X vect?
От: kan_izh Великобритания  
Дата: 31.05.06 11:24
Оценка:
Кодт wrote:

> _>c = a <vector> b <scalar> z;

> _>может быть даже красяво...

> Кстати, можно задействовать оператор %.

> 1) Он также мультипликативный, то есть лишних скобок не надо.
> 2) Дефолтная семантика (остаток от деления), как и у векторного
> умножения — некоммутативна. (Векторное умножение — антикоммутативно, a?b
> = -b?a).
Ну тогда
c = a /vector/ b /scalar/ z;
или
c = a %vector% b %scalar% z;
Сразу будет виден тип оператора.
Бывает ещё смешанное произведение векторов.

Просто сама идея плодить инфиксные операторы в любом количестве.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.