|
17.02.2006, 13:39
|
#1
|
Нуждающийся
Регистрация: 09.11.2005
Сообщений: 69
Написано одно полезное сообщение
|
сабж. Чето ненашел таких функций. Самому писать что-ли?
|
(Offline)
|
|
17.02.2006, 13:58
|
#2
|
Нуждающийся
Регистрация: 09.11.2005
Сообщений: 69
Написано одно полезное сообщение
|
Вопрос вдогонку:
есть два класса, и в обоих есть методы параметрами которых являются указатели на эти классы. Как мне описать эти методы?
Например
class A
{
* * public:
* * float ax;
* * void method(B *x);
};
class B
{
* * public:
* * float bx;
* * void method(A *x);
}
Как видно, в классе A описан метод с параметром указателем на класс B, что вызовет ошибку так как класс B декларирован позже. Как быть?
|
(Offline)
|
|
17.02.2006, 14:16
|
#3
|
Нуждающийся
Регистрация: 09.11.2005
Сообщений: 69
Написано одно полезное сообщение
|
Еще один вопрос
Как перемножить не две, а три или больше матриц? Так же как и две - "строка на столбец" первых двух, а потом "строка на столбец" получившейся матрицы и третьей и т.д?
|
(Offline)
|
|
17.02.2006, 16:41
|
#4
|
Нуждающийся
Регистрация: 09.11.2005
Сообщений: 69
Написано одно полезное сообщение
|
Первый вопрос закрыт, интересует больше второй вопрос.
|
(Offline)
|
|
17.02.2006, 16:53
|
#5
|
ПроЭктировщик
Регистрация: 17.02.2006
Сообщений: 144
Написано 13 полезных сообщений (для 36 пользователей)
|
Originally posted by Платон@17.2.2006, 14:16
Еще один вопрос
Как перемножить не две, а три или больше матриц? Так же как и две -* "строка на столбец" первых двух, а потом "строка на столбец" получившейся матрицы и третьей и т.д?
|
Очень просто:
include "d3dx8math.h"
include "D3d8types.h"
D3DMATRIX m1
D3DMATRIX m2
D3DMATRIX m3
D3DMATRIX m4
D3DXMatrixMultiply(m3,m1,m2)
D3DXMatrixMultiply(m4,m3,m4)
И в m4 получаем результат перемножения 4-х матриц.
|
(Offline)
|
|
17.02.2006, 17:08
|
#6
|
Нуждающийся
Регистрация: 09.11.2005
Сообщений: 69
Написано одно полезное сообщение
|
Нет Maxus, мне нужно ручное перемножение матриц. С подключеными модулями и я смогу перемножить
Вобщем сделал последовательное перемножение, пофиг на этот вопрос.
Остался самый интересный - второй.
Может с помощью прототипа как-нибудь?
|
(Offline)
|
|
17.02.2006, 17:56
|
#7
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
1)преобразование типов:
float a;
int x=int(a);
//или просто int x=a;
;
и по аналогии.
2) матрицы перемножать последователно в строгом порядке: 1 на 2, результат 12 на 3 и т.д.
примерно так
//created by impersonalis
//b00lean team (http://community.boolean.name/)
//библиотека матриц
template <class abstr>
class matrix{
private:
unsigned StringSize;
unsigned CSize;
abstr *buffer;
public:
matrix<abstr> (unsigned size,unsigned size2=0);//стандартный конструктор
matrix<abstr> (unsigned NS,unsigned NC,const matrix &M);//минор (0,0,X - полностью копирует матрицу Х в создаваемую)
matrix<abstr> (char filename[]);//загрузка из файла
matrix<abstr> ();//дефолтный конструктор
~matrix();//деструктор
void in(unsigned SNumber,unsigned CNumber,abstr Z);//ввод
abstr out(unsigned SNumber,unsigned CNumber)const;//вывод
abstr determinant()const;//определитель
abstr Ajk(unsigned NS,unsigned NC)const;//(-1)^(j+k)*|Minor|
void transp(const matrix &M);//транспонирование
bool invert(const matrix &M);//инвертирование
abstr IstrJcol(const matrix &M,unsigned I,unsigned J)const;//перемножение строка*столбец
void operator*(abstr Z);//умножение на коэффициент
void MNOG(const matrix &M1,const matrix &M2);//пермножение матриц
friend ostream & operator <<(ostream &out,const matrix &M);//вывод матрицы в поток в формате HTML-4 как таблицы
void ShowMessage();//генерация виндозной форточки с матрицей
};
template <class abstr>
matrix<abstr>::matrix(unsigned size,unsigned size2){
StringSize=size;
CSize=size2;
if (CSize==0){CSize=StringSize;}
unsigned index=(CSize-1)*StringSize+StringSize;
buffer=new abstr[index];
}
template <class abstr>
abstr matrix<abstr>::IstrJcol(const matrix &M,unsigned I,unsigned J)const{
abstr z=0;
for(unsigned k=1;k<=StringSize;k++){
abstr az=out(I,k);
abstr bz=M.out(k,J);
z=z+az*bz;
}
return z;
}
template <class abstr>
void matrix<abstr>::MNOG(const matrix &M1,const matrix &M2){
//самодомножение a=a*b
if(&M1==this){
matrix <abstr>E(0,0,M1);
MNOG(E,M2);
return;
}
//самодомножение a=c*a
if(&M2==this){
matrix <abstr>E(0,0,M2);
MNOG(M1,E);
return;
}
if(StringSize+CSize!=0){
delete []buffer;
}
//
StringSize=M2.StringSize;
CSize=M1.CSize;
unsigned index=(CSize-1)*StringSize+StringSize;
buffer=new abstr[index];
//
for(unsigned i=1;i<=M1.CSize;i++){
for(unsigned j=1;j<=M2.StringSize;j++){
in(i,j,M1.IstrJcol(M2,i,j));
}
}
}
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
17.02.2006, 18:01
|
#8
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Может с помощью прототипа как-нибудь?
|
именно!
class B;
//class A;
class A
{
* *public:
* *float ax;
* *void method(B *x);
};
class B
{
* *public:
* *float bx;
* *void method(A *x);
};
void main(){
}
должно работать
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
17.02.2006, 18:22
|
#9
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Куда более интересно преобразование чисел в строку и обратно. Для этого юзаем фунЕции:
//целые числа
itoa(исходное_число,строка_приёмник,основание_системы);
x=atoi(строка_с_числом);
//дробные:
функции перевода в строку не нашёл
x=atof(строка_с_числом);
;
Эти функции хранятся в stdlib.h
Реализацию dtoa накодил кое-как сам (есть ещё один алгоритм, но он "таинственным" образом переполняет стек; вариант ниже более устойчив):
short get_byte(double x,int p,int R){
x=fabs(x);
int n=R-p+1;
short a;
if(p>0)
*a=int((x-int(x/pow(10,n))*pow(10,n))/pow(10,n-1 ));
else if(p<0)
*a=int(x*pow(10,-p))%10;
else
*a=-1;
return a;
}
short get_Rlen(double x){
char a[20];
itoa(x,a,10);
return strlen(a)-(x<0?1:0);
}
void dtoa(double x,char t[],int z=10,int omega=5){
short R=get_Rlen(x);
char b[2];
int i;
int j=0;
if(x<0){
*x=fabs(x);
*t[0]='-';
*j++;
}
for(i=1;i<=R;i++){
*short p=get_byte(x,i,R);
*itoa(p,b,10);
*b[1]=0;
*t[j]=b[0];
*j++;
}
t[j]='.';
j++;
for(i=-1;i>=-omega;i--){
*short p=get_byte(x,i,R);
*itoa(p,b,10);
*b[1]=0;
*t[j]=b[0];
*j++;
}
t[j]=0;
}
void dtoa(double x,char t[],int z=10,int omega=5)
работает по аналогии со встроенными функциями:
x - входное_число
t - строка-приёмник
z - добавлено для совместимости ( так быстрее править код, к примеру itoa на dtoa)
omega- точность
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
17.02.2006, 18:57
|
#10
|
Нуждающийся
Регистрация: 09.11.2005
Сообщений: 69
Написано одно полезное сообщение
|
Спасибо большое impersonalis
Но я все равно в твоем коде неразберусь
У меня все попроще )
|
(Offline)
|
|
17.02.2006, 19:11
|
#11
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Всегда пожалуйста =)
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:03.
|