Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Подскажите обработка координат XYZ / 6 сообщений из 6, страница 1 из 1
14.10.2008, 21:08
    #35594530
guest12345
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите обработка координат XYZ
В фоксе нет многомерных массивов, а только двухмерные, т.е аа[X,Y,Z] не прокатит,
допустим мне надо обработать объект имеющий форму куба, в том числе и все внутренние
точки.
Я предполагаю создать табличку с полями X,Y,Z,"здесь дополнительные свойства точки" - D1,D2...
Поля X,Y,Z - числа от 0 до N.
Как правильно создать составной индекс для трех числовых полей, т.е X,Y,Z - Integer.
И как вести поиск координаты по этому составному индексу.
...
Рейтинг: 0 / 0
14.10.2008, 21:19
    #35594545
guest12345
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите обработка координат XYZ
Правильно ли я делаю составной индекс

bintoc(x)+bintoc(y)+bintoc(z)

т.к. каждая координата уникальна то делаю индекс Primary
...
Рейтинг: 0 / 0
14.10.2008, 21:37
    #35594567
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите обработка координат XYZ
Guest12345Правильно ли я делаю составной индекс

bintoc(x)+bintoc(y)+bintoc(z)
Правильно при SET COLLATE TO "MACHINE"
...
Рейтинг: 0 / 0
14.10.2008, 22:05
    #35594582
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите обработка координат XYZ
Guest12345Правильно ли я делаю составной индекс

bintoc(x)+bintoc(y)+bintoc(z)
Если подходить чисто формально, то это правильно.

Guest12345т.к. каждая координата уникальна то делаю индекс Primary
А вот это не есть хорошо. Это идеологически не верно.

Цель индекса Primary - это установка связей с другими таблицами. Если Вы связываете эту таблицу с какой-либо еще и в качестве Foregn Key (внешнего ключа) в этой другой таблице используете эти 3 поля, то индекс типа Primary - уместен.

Если же Ваша цель всего-лишь проверка уникальности данных. Т.е. недопущение появления еще одной записи с теми же координатами, то следует использовать индекс типа Candidad.

Если же у Вас вообще не стоит задача проверки уникальности координат, а индекс нужен для ускорения поиска и запросов Select-SQL, то я бы не советовал создавать составной индекс. Лучше сделать 3 отдельных простых индекса по каждому из полей.
...
Рейтинг: 0 / 0
15.10.2008, 01:05
    #35594708
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите обработка координат XYZ
Guest12345В фоксе нет многомерных массивов, а только двухмерные, т.е аа[X,Y,Z] не прокатит,
Э? А я-то, серый, все время считал, что масивы в Фоксе - это список указателей, то есть всегда одномерны.
Просто для удобства работы с таблицами (а массивы в Фоксе изначально нацелены на scatter, gather, into array, from array) интерпретатор поддерживает вторую размерность, а больше и не надо - таблицы-то максимум двумерны.

Посему размерность можете делать сами, какую захотите. Просто придется для каждого массива описать две функции - извлечение элемента по индексам и запись.
Вот вариант для предопределенного массива public:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
dimension A( 6000 ) && ( 1 .. 10 , 1 .. 20 , 1 .. 30 )

function FromA
parameters i,j,k
return A((i- 1 )* 600 +(j- 1 )* 30 +k)

function ToA
parameters value,i,j,k
A((i- 1 )* 600 +(j- 1 )* 30 +k)=value
return

myValue=FromA( 5 , 8 , 12 )+ 100 
=ToA(myValue, 4 , 3 , 14 )

Поскольку мы сами управляем чтением-записью, можно сделать и "полууниверсальную" функцию:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
set udfparms to reference
dimension A( 24004 ) && ( 1 .. 10 , 1 .. 20 , 1 .. 30 , 1 .. 40 )
a( 1 )= 10 
a( 2 )= 20 
a( 3 )= 30 
a( 4 )= 40 

function FromA
parameters a,i,j,k,m
* здесь могут быть проверки выхода индекса за размерность
return A((i- 1 )*a( 2 )*a( 3 )*a( 4 )+(j- 1 )*a( 3 )*a( 4 )+(k- 1 )*a( 4 )+m+ 4 )

function ToA
parameters value,a,i,j,k,m
* здесь могут быть проверки выхода за размерность
A((i- 1 )*a( 2 )*a( 3 )*a( 4 )+(j- 1 )*a( 3 )*a( 4 )+(k- 1 )*a( 4 )+m+ 4 )=value
return

myValue=FromA(A, 5 , 8 , 12 , 22 )+ 300 
=ToA(myValue,A, 4 , 3 , 14 , 33 )
Можно еще дойти до того, чтобы передавать количество измерений, или завести отдельную таблицу для определений многомерных массивов... можно организовать индексы с 0 или вообще -10..20. Кстати, номер элемента можно строить и по формуле (для последнего примера) a(4)*(a(3)*(a(2)*(i-1)+(j-1))+(k-1))+(m-1)+(4+1) - ни на какие мысли не наводит? :-)
...
Рейтинг: 0 / 0
15.10.2008, 01:44
    #35594725
guest12345
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите обработка координат XYZ
Большое спасибо за развернутые ответы, то что надо.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Подскажите обработка координат XYZ / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]