Важная информация

User Tag List

Показано с 1 по 7 из 7

Тема: Клиппирование линии

  1. #1
    Activist
    Регистрация
    23.01.2005
    Сообщений
    234
    Благодарностей: 15
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Клиппирование линии

    есть-ли у кого-то быстрая процедура клиппирования линии для 16 и 8 битных координат?
    я использую для этих целей процедуру из исходников X-Trade, предназначенную для работы с полигонами,
    но это конечно-же не оптимально. я сам писать пока даже не пытался, сделаю это наверное в ближайшие дни, но в любом случае буду признателен помощи.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Veteran Аватар для Destr
    Регистрация
    26.03.2008
    Адрес
    Питкяранта
    Сообщений
    1,426
    Благодарностей: 643
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Понятно что жутко поздно, но я эту проблему (для себя) только сейчас решил. Может кому ещё пригодится.
    В общем метод подсказал SAM style.
    Суть состоит в том, чтобы разбивая исследуемую линию на два равных куска постепенно приближатся к искомому значению (заданой границе).
    Вроде-бы это называется аппроксимацией...
    После долгих мучений выродил я такой вот код:
    Код:
    APPROX
    XN	EQU $+1
    	LD HL,0
    XK	EQU $+1
    	LD DE,0
    	ADD HL,DE
    	SRA H
    	RR L
    	LD (XM),HL
    YN	EQU $+1
    	LD HL,0
    YK	EQU $+1	
    	LD DE,0
    	ADD HL,DE
    	SRA H
    	RR L
    	LD (YM),HL
    	LD A,H
    	XOR B
    	JP P,CPHB1
    	LD A,H
    	RLA
    	JP CPHB2
    CPHB1	SBC HL,BC
    	RET Z
    CPHB2	JP C,APPROX2
    XM	EQU $+1
    	LD HL,0
    	LD (XK),HL
    	LD HL,(YM)
    	LD (YK),HL
    	JP APPROX
    APPROX2	LD HL,(XM)
    	LD (XN),HL
    YM	EQU $+1
    	LD HL,0
    	LD (YN),HL
    	JP APPROX
    Это подпрограммка. Вызывать её нужно так:
    Сперва в XN и YN положить координаты начала отрезка.
    В YK и XK - соответственно координаты конца.
    В регистровую пару BC - ограничитель (ну границу экрана например)
    Потом делать CALL APPROX
    На выходе в XM и YM будут откорректированые коррдинаты.
    Все значения 16 бит, знаковые.
    Решение о том нужно ли клиппирование вообще - принимать заранее.
    Ну т.е. проверять если линия вся лежит в видимой или вся в невидимой области (тогда вызывать APPROX не нужно, даже противопоказано )
    Да, ещё! Перед вызовом нужно отсортировать координаты по возрастанию Y (чтобы XN YN были меньше чем XK YK. Т.е. "начало" всегда "сверху" - если по спековому экрану в кодах)

    P.S. Можно было-бы оформить прогу и красивше, но я стремился к максимальному быстродействию. Выжал всё что смог, может быть можно и быстрей, но я не знаю как...
    Последний раз редактировалось Destr; 09.01.2015 в 12:02.

  4. Этот пользователь поблагодарил Destr за это полезное сообщение:
    Reobne (09.01.2015)

  5. #3
    Banned
    Регистрация
    12.02.2014
    Адрес
    г. Арзамас
    Сообщений
    6,122
    Благодарностей: 1075
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Не знаю, как переваривает ассемблер, но все же привычнее писать:
    YN EQU $+1
    LD HL,0
    YK EQU $+1
    LD DE,0
    так:
    YN: LD HL,0
    YK: LD DE,0

  6. #4
    Veteran Аватар для Destr
    Регистрация
    26.03.2008
    Адрес
    Питкяранта
    Сообщений
    1,426
    Благодарностей: 643
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от denpopov Посмотреть сообщение
    YN: LD HL,0
    Так ведь тогда YN будет указывать на LD HL (#21), а не на #00 #00 которые идут следом.

    Не, можно конечно и по-твоему, но тогда координаты загружать нужно так:
    LD HL,начальный Y
    LD (YN+1),HL

  7. #5
    Banned
    Регистрация
    12.02.2014
    Адрес
    г. Арзамас
    Сообщений
    6,122
    Благодарностей: 1075
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Destr Посмотреть сообщение
    Так ведь тогда YN будет указывать на LD HL (#21), а не на #00 #00 которые идут следом
    тогда
    LD (YM+1),HL

  8. #6
    Veteran Аватар для Destr
    Регистрация
    26.03.2008
    Адрес
    Питкяранта
    Сообщений
    1,426
    Благодарностей: 643
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Warning!
    Выяснилось что приведёный мной алгоритм может давать неверные результаты (при определённом разбросе координат)
    Поэтому в зависимости от размеров - процедуру нужно использовать в чуть изменённом виде.

    Фрагменты:
    ADD HL,DE
    SRA H
    RR L

    Следует заменить на:
    LD A,H
    XOR D
    ADD HL,DE
    JP P,$+4
    CCF
    RR H
    RR L

    Скорректированый вариант:

    Скрытый текст


    Код:
    APPROX
    XN	EQU $+1
    	LD HL,0
    XK	EQU $+1
    	LD DE,0
    	LD A,H
    	XOR D
    	ADD HL,DE
    	JP P,$+4
    	CCF
    	RR H
    	RR L
    	LD (XM),HL
    YN	EQU $+1
    	LD HL,0
    YK	EQU $+1	
    	LD DE,0
    	LD A,H
    	XOR D
    	ADD HL,DE
    	JP P,$+4
    	CCF
    	RR H
    	RR L
    	LD (YM),HL
    	LD A,H
    	XOR B
    	JP P,CPHB1
    	LD A,H
    	RLA
    	JP CPHB2
    CPHB1	SBC HL,BC
    	RET Z
    CPHB2	JP C,APPROX2
    XM	EQU $+1
    	LD HL,0
    	LD (XK),HL
    	LD HL,(YM)
    	LD (YK),HL
    	JP APPROX
    APPROX2	LD HL,(XM)
    	LD (XN),HL
    YM	EQU $+1
    	LD HL,0
    	LD (YN),HL
    	JP APPROX
    [свернуть]
    Последний раз редактировалось Destr; 12.01.2015 в 19:59.

  9. #7
    Master Аватар для kotsoft
    Регистрация
    04.04.2009
    Адрес
    Котлас
    Сообщений
    632
    Благодарностей: 189
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    ЫЫЫ ответ нашел своего читателя, несколько дней до 10 лет недотянули)

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •