Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2010, 19:50   #1
Darknes
Пользователь
 
Аватар для Darknes
 
Регистрация: 28.06.2010
Сообщений: 40
Вопрос ТЕМА : КЛАССЫ!!!!!!

Задание такое:
Создать класс vector3D, задаваемый тройкой координат. Обязательно должны быть реализованы: сложение и вычитание векторов, скалярное произведение векторов, умножение вектора на скаляр, вычисление длины вектора, сравнение длины векторов, поворот вектора на заданное количество градуссов (целое число от 0 до 360 градусов) вокруг одной из осей относительно центра вектора, операции ввода-вывода.

у мня есть 3 операции тока:

*.h
Код:
#ifndef _vector3D_H_
#define _vector3D_H_
 
class vector3D{
    public:
    vector3D(int inita=0, int initb=0, int initc=0): a(inita), b(initb), c(initc){};
 
    vector3D operator+(vector3D v2);
    vector3D operator-(vector3D v2);
    vector3D operator*(vector3D v2);
    void show();
 
    private:
    int a;
    int b;
    int c;
 
};
 
#endif


*.cpp -реализация класса
Код:
#include "vector3D.h"
 
vector3D vector3D::operator+(vector3D v2){
    vector3D vec;
    vec.a=a+v2.a;
    vec.b=b+v2.b;
    vec.c=c+v2.c;
    return vec;
}
 
 
vector3D vector3D::operator-(vector3D v2){
    vector3D vec;
    vec.a=a-v2.a;
    vec.b=b-v2.b;
    vec.c=c-v2.c;
    return vec;
}
 
vector3D vector3D::operator*(vector3D v2){
    vector3D vec;
    vec.a=a*v2.a;
    vec.b=b*v2.b;
    vec.c=c*v2.c;
    return vec;
}
 
 
void vector3D::show(){
    std::cout<<a<<","<<b<<","<<c;
}


*.cpp -использование
Код:
#include <iostream>
#include <conio.h>
#include <cmath>
#include "vector3D.h"
#include "vector3D.cpp"
 
 
int main()
{
    vector3D v1(7,8,9);
    vector3D v2(3,2,1);
 
    (v1+v2).show();
    std::cout<<std::endl;
    (v1-v2).show();
    std::cout<<std::endl;
    (v1*v2).show();
 
    return 0;
}


Прошу помочь с реализацией дальнейших условий.
Зарание Спасибо.

Последний раз редактировалось Stilet; 23.09.2010 в 09:28.
Darknes вне форума Ответить с цитированием
Старый 23.09.2010, 01:21   #2
savva
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 225
По умолчанию

std:: зачем каждый раз?(самому интересно)

Дальнейшие условия реализуешь в виде членов-функций класса,а потом в головной процедуре просто вызываешь.А ответы на вопросы как,найдёшь в гугле там есть и математическое описание действий с векторами,и реализованные на языке С действия.
За помощь: Нажмите на весы слева от сообщения!
savva вне форума Ответить с цитированием
Старый 23.09.2010, 17:02   #3
Darknes
Пользователь
 
Аватар для Darknes
 
Регистрация: 28.06.2010
Сообщений: 40
По умолчанию

Сможете дать коментарии по данной программме???
Объясеить её.
Darknes вне форума Ответить с цитированием
Старый 24.09.2010, 00:36   #4
savva
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 225
По умолчанию

так это не твоё?
завтра,сейчас занят.
За помощь: Нажмите на весы слева от сообщения!
savva вне форума Ответить с цитированием
Старый 25.09.2010, 13:06   #5
slava7c
Новичок
Джуниор
 
Регистрация: 25.09.2010
Сообщений: 3
По умолчанию

Детали не вспомню, давнон не занимался графикой, но по хорошему - тебе нужен 4-х размерный вектор и матрицы 4х4 для операций... детали в любой книжке - по памяти программирование OpenGL )
slava7c вне форума Ответить с цитированием
Старый 26.09.2010, 04:25   #6
SlavikLi
Новичок
Джуниор
 
Регистрация: 26.09.2010
Сообщений: 2
По умолчанию

class Vector3d {
float components[3];
public:
void Init(float&,float&,float&);
void Init(string&);
void Init(Vector3d&);
string toString();
Vector3d Add(Vector3d&);
Vector3d Sub(Vector3d&);
float Dot(Vector3d&);
Vector3d Cross(Vector3d&);
float Angle(Vector3d&);
float Length();
void Normalize();
bool Equ(Vector3d&);
float GetX(){return components[0];}
float GetY(){return components[1];}
float GetZ(){return components[2];}
void Read();
friend Vector3d operator+(const Vector3d&, const Vector3d&);
friend Vector3d operator-(const Vector3d&, const Vector3d&);
};

void Vector3d::Init(float &x, float &y, float &z) {
components[0]=x;
components[1]=y;
components[2]=z;
}

void Vector3d::Read() {
float x,y,z;
cout<<"Enter x component: "; cin>>x;
cout<<"Enter y component: "; cin>>y;
cout<<"Enter z component: "; cin>>z;
this->Init(x,y,z);
}


string Vector3d::toString() {
Vector3d temp=*this;
string res="";
string digits="0123456789";
for (int i=2; i>=0; i--) {
bool neg=(temp.components[i]<0);
int k=fmod(abs(temp.components[i]),10);
while (abs(k)>1) {
k=fmod(abs(temp.components[i]),10);
temp.components[i]/=10;
res=digits[k]+res;
}
if (neg) res="-"+res;
if (i>0) res=","+res;
}
return res;
}

//Сложение векторов
Vector3d Vector3d::Add(Vector3d &vec) {
Vector3d temp=*this;
for (int i=0; i<3; i++) {
temp.components[i]+=vec.components[i];
}
return temp;
}

//Вычитание векторов
Vector3d Vector3d::Sub(Vector3d &vec) {
Vector3d temp=*this;
for (int i=0; i<3; i++) {
temp.components[i]-=vec.components[i];
}
return temp;
}

//Скалярное произведение
float Vector3d::Dot(Vector3d &vec) {
Vector3d temp=*this;
float res(0);
for (int i=0; i<3; i++) {
res+=temp.components[i]*vec.components[i];
}
return res;
}

//Угол между векторами
float Vector3d::Angle(Vector3d& vec) {
Vector3d temp=*this;
float l1=temp.Length();
float l2=vec.Length();
if ((l1!=0) && (l2!=0)){
return acos((temp.Dot(vec)/(l1*l2)));
}
else {
return 0;
}
}

//Векторное произведение
Vector3d Vector3d::Cross(Vector3d &vec) {
Vector3d temp=*this;
Vector3d res;
res.components[0]=temp.components[1]*vec.components[2]-temp.components[2]*vec.components[1];
res.components[1]=temp.components[2]*vec.components[0]-temp.components[0]*vec.components[2];
res.components[2]=temp.components[0]*vec.components[1]-temp.components[1]*vec.components[0];
return res;
}

//Длина вектора
float Vector3d::Length () {
float res(0);
for (int i=0; i<3; i++) {
res+=this->components[i]*this->components[i];
}
return sqrt(res);
}

//Сравнение векторов (можно расписать до результата 1,0,-1)
bool Vector3d::Equ(Vector3d& vec) {
return (this->Length()>vec.Length());
}

//Нормализация вектора (приведение к единичной длине)
void Vector3d::Normalize() {
float length=this->Length();
for (int i=0; i<3; i++) {
this->components[i]/=length;
}
}

//Перегрузка сложения
Vector3d operator+(Vector3d& v1, Vector3d& v2){
Vector3d res=v1;
res=res.Add(v2);
return res;
}

//Перегрузка вычитания
Vector3d operator-(Vector3d& v1, Vector3d& v2){
Vector3d res=v1;
res=res.Sub(v2);
return res;
}

//и т.д

Последний раз редактировалось SlavikLi; 26.09.2010 в 04:43.
SlavikLi вне форума Ответить с цитированием
Старый 26.09.2010, 04:34   #7
SlavikLi
Новичок
Джуниор
 
Регистрация: 26.09.2010
Сообщений: 2
По умолчанию

По поводу поворота вектора на угол ищи афинные преобразования. Там все делается с помощью матриц 4 на 4, но можно привести к размерности 3 на 3 и будет тебе счастье.
SlavikLi вне форума Ответить с цитированием
Старый 26.09.2010, 12:39   #8
Darknes
Пользователь
 
Аватар для Darknes
 
Регистрация: 28.06.2010
Сообщений: 40
По умолчанию

спасибо народ!!!!
Darknes вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Тема: файлы на С++ ulkin2007 Общие вопросы C/C++ 1 26.05.2010 09:33
тема @AмИгО@ Помощь студентам 1 20.05.2009 20:44