Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];

Вниз

как узнать какие элементы масива принадлежат другому масиву   Найти похожие ветки 

 
Lena19   (2004-05-27 17:44) [0]

Всем привет.
есть масив
str:array  of record  Top,Left,Width,Height:integer;s:string[255]; end;
и известна прямоугольная область (задана высотой и шириной)
как узнать какие елементы масива принодлежат данной области ?
по возможности за минимальное количество шагов вичисления.


 
GuAV ©   (2004-05-27 18:19) [1]


> и известна прямоугольная область (задана высотой и шириной)

имхо, маловато условия...


 
default ©   (2004-05-27 18:24) [2]

примерно то же что сказать: известная фигура(задана своей площадью), хотя тут не бескон-он множ-во вариантов потому что пиксели не "дробятся", но всё же...


 
Ega23 ©   (2004-05-27 18:24) [3]

Lena19   (27.05.04 17:44)

Зачёт?


 
hamster ©   (2004-05-27 18:24) [4]

Извините, а что значит "имхо"?


 
default ©   (2004-05-27 18:26) [5]

hamster ©   (27.05.04 18:24) [4]
по моему скромному мнению


 
Ega23 ©   (2004-05-27 18:27) [6]

hamster ©   (27.05.04 18:24) [4]
IMHO ( In My Humble Opinion ) по моему скромному мнению ( в сетях употребляется также непосредственно в виде "имхо" (существительное среднего рода) )


 
Lena19   (2004-05-27 19:00) [7]

to ega23 последний зачот был здан 12 лет назад.(а 19 ето мой возраст когда была мной написана прога Hello Word)

прямоугольная область (задана высотой и шириной) ето Canvas для отображения переменнй str координаты верхнего левого угла
всегда 0,0 а координаты нижнего правого угла  меняются .
требуется узнать скока елементов масива str  можно отобразить на канве.при условии что первый елемент масива не обязательно с координатами 0,0.


 
default ©   (2004-05-27 19:05) [8]

в чём сложность?


 
VMcL ©   (2004-05-27 19:08) [9]

>>hamster ©  (27.05.04 18:24) [4]

<offtopic>
В русской интерпретации также ИМХО = "имею мнение, хрен оспоришь".
</offtopic>


 
Fay ©   (2004-05-27 19:44) [10]

<offtopic TEXT="В русской интерпретации также ИМХО = имею мнение, хрен оспоришь"/>
8)


 
jack128 ©   (2004-05-27 19:54) [11]


> "имхо" (существительное среднего рода) )
Cейчас придет ИМХО(с) и что то с тобой cделает за такие слова ;-)

> требуется узнать скока елементов масива str  можно отобразить
> на канве
Тонкий намек - не забудь про TCanvas.ClipRect


 
GuAV ©   (2004-05-28 00:11) [12]

VMcL ©   (27.05.04 19:08) [9]
LOL
Не знал про эту интерпретацию. Буду тогда юзать англ. "IMHO"

"какие елементы масива принодлежат данной области"
"скока елементов масива str  можно отобразить на канве"
- Так это 2 разных условия. Причем второе не совсем понятно.


 
Lena19   (2004-05-28 17:22) [13]

какие елементы масива (str[x].top,str[x].left) принодлежат данной области канвы(0,0,canvas.width,canvas.height) тобиш скока елементов str[x].s можно отобразить. (шрифт может менятся для каждой буквы переменной s)
для етго  есть str.width str.height


 
Ega23 ©   (2004-05-28 17:24) [14]

Cейчас придет ИМХО(с) и что то с тобой cделает за такие слова ;-)

Это не со мной, это с Lingvo


 
Erik1   (2004-05-28 17:29) [15]

Тебе же в [11] прямо намекнули, что у Canvas это уже реализовано!


 
Lena19   (2004-05-28 17:40) [16]

to erik1
МОЖЕТ Я ЧЕГО НЕ ПОНИМАЮ (разъясните пожалуста)
но посчитать это надо до того как текст ляжет на канву


 
KADAN ©   (2004-05-28 20:21) [17]

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


 
Lena19   (2004-05-28 23:16) [18]

to kadan
внимательней смотри текст вопроса: STR[N].TOP;STR[N].LEFT;STR[N].HEIGHT;STR[N].WIDTH;тобиш каждая строка имеет координаты вывода и размер в пикселях


 
GuAV ©   (2004-05-28 23:29) [19]


> какие елементы масива (str[x].top,str[x].left) принодлежат
> данной области канвы(0,0,canvas.width,canvas.height) тобиш
> скока елементов str[x].s можно отобразить

принодлежат - любая точка str[х] принадлежит множеству точек канвы.
отобразить - imho ещё и чтоб не перекрывались.
какие - множество элементов
скока - количество элементов.
to Lena19. отвечать на неточно сформулированный вопрос весьма затруднительно.


 
miwa ©   (2004-05-29 07:26) [20]

>>Cейчас придет ИМХО(с) и что то с тобой cделает за такие слова ;-)


type
TOfftopic = record
   text: string;
end;
var Offtopic: TOfftopic;
begin
 Offtopic.Text:="Я плакал :о))))))))))))))))))))))))))))))))))";
end;


 
KADAN ©   (2004-05-29 09:02) [21]

>lena19
можно создать двумерный массив (ширина, высота) из нулей, затем в цикле перебирать все записи, если все точки записи - нули в новом массиве, тогда эту запись пометить как входящую, а точки - единичками в новом массиве. тогда ничего не будет перекрываться. самый простой вариант...  но... задача усложнится, если надо расположить как можно больше строк в этом прямоугольнике.


 
GuAV ©   (2004-05-29 10:36) [22]


> точки записи - нули в новом массиве, тогда эту запись пометить
> как входящую, а точки - единичками в новом массиве. тогда
> ничего не будет перекрываться

Проверять каждую из записей на непринадлежноость всем подходящим предыдущим - ещё проще.

> задача усложнится, если надо расположить как можно больше
> строк в этом прямоугольнике.

вот и я говорю - нужна точная формулировка. Может их ещё и двиать можно.

Кстати, чтоза задача специфическая? Обычно, имхо, пользуют простой string вместо всего этого record"a а у канвы сть св-во TextExtent.


 
jack128 ©   (2004-05-29 10:45) [23]

type

 // orInside - прямоугольник находится ВНУТРИ другого прямоугольника
 // orOverlapped - прямоугольники ЧАСТИЧНО перекрываются
 // orOutside - прямоугольник находится ВНЕ другого прямоугольника
 TOverlappedRectState = (orInside, orOverlapped, ovOutside);

// вычисляет положение прямоугольника Rect относительно BaseRect
function GetOverlappedState(Rect, BaseRect: TRect): TOverlappedRectState;
begin
 if (Rect.Top > BaseRect.Bottom) or (Rect.Left > BaseRect.Right) or
   (Rect.Bottom < BaseRect.Top) or (Rect.Right < BaseRect.Left) then
   Result := orOutSize else
 if (Rect.Top >= BaseRect.Top) and (Rect.Left >= BaseRect.Left) and
   (Rect.Bottom <= BaseRect.Bottom) or (Rect.Right <= BaseRect.Right) else
 Result := orOverlapped;
end;


Пример

if GetOverlappedState(str[i], Canvas.ClipRect) <> orOutSize then
 // эту строчку нужно нарисовать


 
Глеб ©   (2004-05-29 10:47) [24]

ИМХО

var
 x: array of TRec;
begin

 if random(2) = 0 then
 label1.caption := "входит"
else
 label1.caption := "посмотри на Label2";
label2.caption := "не входит! облом!;

end;


 
jack128 ©   (2004-05-29 10:56) [25]

Только все это бред, потому что Canvas все равно не отрисует то что выходит за приделы СlipRect - внутри, где то в недрах виндоус происходит точно такая же проверка..


 
GuAV ©   (2004-05-29 10:57) [26]


> if GetOverlappedState(str[i], Canvas.ClipRect) <> orOutSize
> then

Нифинга подобного. Если даже Typecast сделать, то все равно:

> str:array  of record  Top,Left,Width,Height:integer;s:string[255];
> end;

т.е. Top и Left наоборот, а вмеснто Right, Bottom - Width,Height


 
jack128 ©   (2004-05-29 11:02) [27]


> > str:array  of record  Top,Left,Width,Height:integer;s:string[255];
>
> > end;

а ну да.Нобратил внимания

type
 StrData = record
   Top,Left,Width,Height:integer; // хотя по мне так лудше заменить эти поля на Rect: TRect;
   s:string[255];
 end;
function GetRect(d: TStrData): TRect
begin
// тут сама догодайся, что писать..
end;

if GetOverlappedState(GetRect(str[i]), Canvas.ClipRect) <> orOutSize


 
GuAV ©   (2004-05-29 11:02) [28]

Пока автор сией ветки не ответит на [22],
мы врядли продвинемся сколь-нибуть далее :-(


 
Глеб ©   (2004-05-29 13:48) [29]

А пока кто-нибудь не ответит на [24], ничего хорошего тем более не будет.


 
Anatoly Podgoretsky ©   (2004-05-29 13:53) [30]

IntersectClipRect и справка по Clipping Functions


 
Глеб ©   (2004-05-29 13:57) [31]

надо random вгонять


 
GuAV ©   (2004-05-29 14:32) [32]

<offtopic>

> А пока кто-нибудь не ответит на [24], ничего хорошего тем
> более не будет.


Отвечаю на 24:
- Какова вероятность что выйдя на улицу встретите динозавра
- 50%. Или встречу или нет.

т.е. приведеный алгоритм рабочий.
</offtopic>


 
KADAN ©   (2004-05-29 16:38) [33]

>GuAV ©   (29.05.04 10:36) [22]
>Проверять каждую из записей на непринадлежноость всем подходящим предыдущим - ещё проще

Спасибо, что поправил, как-то я сам не подумал :)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.153 c
1-1086067714
Master Paleva
2004-06-01 09:28
2004.06.13
Имитация нажатия клавиш на клавиатуре


6-1082722632
xman
2004-04-23 16:17
2004.06.13
mailslot already exests


1-1086162497
DmitryMN
2004-06-02 11:48
2004.06.13
Контротлная сумма


14-1085295633
R
2004-05-23 11:00
2004.06.13
Почему Пепси


14-1085777429
Yorick
2004-05-29 00:50
2004.06.13
Кто-где живет?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский