Понятно что жутко поздно, но я эту проблему (для себя) только сейчас решил. Может кому ещё пригодится.
В общем метод подсказал 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. Можно было-бы оформить прогу и красивше, но я стремился к максимальному быстродействию. Выжал всё что смог, может быть можно и быстрей, но я не знаю как...