-ћузыка

”спеть сохранить в EEPROM при сбросе питани€

ƒневник

¬оскресенье, 04 »юн€ 2017 г. 23:56 + в цитатник

ƒело и предыстори€ така€: решил € таки перебрать счЄтчик ћикрон —Ёќ-1.10.1 на базе AD7755 и прикрутить к нему цветастый TFT LCD дисплей, чтобы видеть как денежка утекает в пустоту🤑 и отражаетс€ на цене издели€, выскакивающего из-под станка.


ћикрон —Ёќ-1.10.1 AD7755 и ATMega8 (700x525, 95Kb)

ѕоскольку станок потребл€ет множество разных напр€жений по разным проводам, от +3,3¬ до +50¬, единственным разумным решением считаю прикрутить счЄтчик на 220¬ переменного тока возле входа в розетку. ѕо сути, у счЄтчика есть импульсный выход, который даже на колодку выведен, 2 клеммы, которые нормально разомкнуты, однако импульс инверсный, и размыкаютс€ они только при прохождении импульса от AD7755. “аким образом, как и в проводной сигнализации, злоумышленник не сможет оборвать сигнальную цепь. ќборвав еЄ, он обречЄт вечно повисший импульс в нуле застр€ть в глубинах централизованной считалки в подвале, что сразу же будет обнаружено.  лемма безопасна€ - размыкание происходит через оптрон, поэтому € мог и не разбирать счЄтчик, а лишь подключитьс€ к этим контактам. Ќо рука чесалась, и € встроил в корпус счЄтчика USB-зар€дку с Aliexpress за 49₽, котора€ даЄт +5¬, достаточных дл€ запитки моей платы микроконтроллера с цветным дисплеем.



ќднако тем и хороша логика работы механического счЄтчика, что импульс дЄргает катушку счЄтчика и передвигает колесо при каждом импульсе, при отключении питани€ Ђданныеї, показани€ уже сохранены физически. Ёлектрически же мы можем держать их в ќ«” до момента сброса питани€, или записывать каждый импульс в EEPROM. ќднако ресурс EEPROM сильно ограничен - лишь 100 000 циклов перезаписи. ≈сли счЄтчик выдаЄт 4000 импульсов на 1 к¬т, то дл€ одного байта EEPROM ресурс исчерпаетс€ за 25 к¬т. Ёто меньше мес€чного потреблени€, а чтобы сохран€ть хот€ бы годовые показани€, нужен DWORD (32 бита, 4 байта). Ќо даже если устроить некоторый TRIM, как у SSD дл€ €чеек EEPROM, распредел€ть износ, всего объЄма EEPROM (512 байт у ATMega8, по 4 байта на 1 показание) хватит лишь на ((512/4)*100 000)/4000=3 200 к¬т⋅ч. Ёто лишь год и контроллер можно выпаивать и выбрасывать. “ут ещЄ умные мужики на хабрах пишут, что мол EEPROM внутри ATMega имеет не побайтную адресацию, а тоже WORD или DWORD -
тоже можно было бы учесть, чтоб не перезаписывать лишний раз, но это уже крохоборство будет .


 ак сэкономить ресурс энергонезависимой пам€ти EEPROM при условии непредсказуемого пропадани€ питани€? „тобы не запоминать каждый импульс?  ак не износить ресурс EEPROM AVR?


” устройств с батарейным питанием момент сохранени€ состо€ни€ реализован проще - опрос напр€жени€ батареи/ј Ѕ с помощью ј÷ѕ, и при падении до минималки 3,7¬ мы просто сохран€ем и уходим в глухой сон, отключаем периферию, компараторы и не реагируем на внешние прерывани€. ѕри этом у схемы вполне хватает сил и энергии сохранить в EEPROM ещЄ вагон информации.


Ќо при непредсказуемом питании на помощь также придЄт встроенный ј÷ѕ. ѕросто воспользуемс€ вредным советом отделить шину питани€ контроллера диодом от основной шины питани€, которую через делитель (R1, R2) заведЄм на ј÷ѕ (PC0). ƒл€ демонстрации можно понавешать светодиодов на обе шины питани€🎄.



—охранить EEPROM при сбросе питани€ (640x323, 19Kb)

»так, на всю схему приходит +5¬ от зар€дки с Aliexpress, котора€ встроена в счЄтчик (и тоже учитываетс€), они же через делитель приход€т на ј÷ѕ, а сам контроллер запитан чуть более низким напр€жением +4,2¬ из-за падени€ на диоде. Ќичего страшного. я вз€л первый попавшийс€ диод 2ƒ106ј, и он заработал. ѕосле диода ставим конские конденсаторы 2 шт. по 1000 мк‘, можно больше, однако смотрите, чтобы блок питани€ выдержал при пуске и потребление контроллера, и зар€дку конденсаторов. Ќу и конечно, не забываем об обв€зке-фильтрах дл€ ј÷ѕ (AVCC, AREF).


„то происходит при отключении питани€ 220¬? Ќапруга пропадает до диода моментально (светодиод тухнет сразу же), потому что в Aliexpress USB-зар€дке конденсаторов кот наплакал, а вот после диода напруга снижаетс€ постепенно в течение 1,5...2 секунд. Ётого времени более, чем достаточно, чтобы ј÷ѕ пон€л, что напруга упала и быстро записать 4 байта в EEPROM. –азумеетс€, все вышеприведЄнные цифры и номиналы подобраны на глаз экспериментально, у мен€ до диода ещЄ стоит CH340G USB-UART, а будет ещЄ подсветка диспле€. ѕитание диспле€ будет висеть на шине питани€ контроллера. ¬ообще по логике работы целесообразно диод ампера на полтора поставить, чтобы всЄ, что напр€мую подключено к контроллеру отключалось вместе с ним и не происходило подпитки схемы через ножки портов, что может спалить AVR.


¬ данном решении нашЄл единственный кос€к: пока работаю без Watchdog'а🐶, возможно, он снимет проблему кратковременного пропадани€ питани€, когда контроллер уже ушЄл в сон, но на конденсаторах ещЄ осталс€ зар€д в +1...2¬, и при возвращении питани€ (AC back, DC back) не происходит RESET, контроллер не тактируетс€ благодар€ оператору END. ј также одна непри€тна€ мастырка - пин RESET не равнозначен сбросу питани€ —хЁ.


ј теперь немного кода на скорую руку (BASCOM-AVR):





Config Pind.6 = Input ' ѕока без прерываний, опрашиваем импульсный вход в цикле
Config Adc = Single , Prescaler = 16 , Reference = Internal '–еференс внутренний
' дл€ перестраховки
Dim Currentcounts As Dword , Checkcounts As Dword , Emptydword As Dword
Dim Megacounts As Byte
Dim Eepromaddress As Byte ' ƒаЄм 256 байт (64 метки) от &H00 до &HFF адрес в ≈≈ѕ–ќће
Dim Voltage As Word 'ќтлов показани€ ј÷ѕ, падени€ напруги

Emptydword = &HFFFFFFFF 'Ќе умеет писать константу в ≈≈ѕ–ќћ!!!!!11
' ѕоказани€ счЄтчика будут измер€тьс€ 32 битами (DWORD) (по адресам а также байтом
' по адресу &H104, который €вл€етс€ началом следующего разр€да после DWORD. “ипа
' продолжение разр€дности Megacounts

Readeeprom Megacounts , &H104
If Megacounts = &HFF Then 'ѕервый запуск, в ≈ѕ–ќће пусто
Megacounts = 0
Writeeeprom Megacounts , &H104
Elseif Megacounts = &HFE Then
Print "Counter locked!" ' »ди беги за новым счЄтчиком!
End
' Ѕлокируем счЄтчик при 4 294 967 295 * 255 импульсах = 1†095†216†660†225, что в
' киловаттах 274 877 906. ’ватит на дес€тилети€ промышленного и столети€ бытового
' использовани€.
End If
' “еперь технологи€ выравнивани€ износа дл€ EEPROM (TRIM :)
' Ќайти крайнее нулевое значение в еепроме
' —юда б добавить проверку нынешнего и последнего значени€ в EEPROM, чтобы не писать
' в две €чейки одно и то же значение.
For Eepromaddress = 0 To &HFF Step 4
Readeeprom Currentcounts , Eepromaddress
If Currentcounts = &HFFFFFFFF Then
Eepromaddress = Eepromaddress - 4
Readeeprom Currentcounts , Eepromaddress
Eepromaddress = Eepromaddress + 4
Exit For 'ЌашЄлс€ крайн€€ пуста€ €чейка
End If
Next Eepromaddress
' ≈сли крайний адрес был последним, счЄтчик Eepromaddress скинулс€ в &H00, значит
' можно засейвить показани€ в ќ«” и вытереть весь EEPROM. ќпераци€ ƒЋ»“≈Ћ№Ќјя!
If Eepromaddress = &H00 Then
If Currentcounts <> &HFFFFFFFF Then
Print "Erasing EEPROM..."
For Eepromaddress = 0 To &HFF Step 4
Writeeeprom Emptydword , Eepromaddress
Next Eepromaddress
End If
End If
Print "Null place:" ; Hex(eepromaddress) ' ќтладочна€ строка, что мол писать будем сюда
Print "Previous counts:" ; Hex(megacounts) ; " " ; Hex(currentcounts) '» то, что
' было считано из предыдущей €чейки

Start Adc 'Ќачинаем слушать и быть начеку пропадани€ питани€
Do
Voltage = Getadc(0) ' ƒа, тупо проверка в цикле. Ќадо бы прерывани€ми, но впадлу
' без платы, на макетке
If Pind.6 = 0 Then 'ќтлавливаем сам импульс
While Pind.6 = 0 : Wend '∆дЄм конца импульса. Ќеправильно с точки зрени€
' вмешательства злоумышленника на длине проводов в 5 см =)
If Currentcounts = &HFFFFFFFF Then 'ѕока невн€тно, при первом же включении
' разр€д будет увеличен. Ќо никто не мешает насильственно при прошивке и первом
' запуске в ≈≈ѕ–ќћ &H00 прописать четыре нул€!
Incr Megacounts
Writeeeprom Megacounts , &H100
Currentcounts = 0
Else
Incr Currentcounts ' ќдна четырЄхтыс€чна€ киловатта израсходована: 0,25¬т
End If
Print Hex(megacounts) ; " " ; Currentcounts ' ѕока print, но буду здесь процедуру
' вывода на дисплей всовывать при каждом импульсе. »ли нет.
End If
If Voltage < 450 Then 'јл€рм! ѕадение напруги! ћагическое число 450
' экспериментальное. „тоб не случалось ложных срабатываний при просадке -0,5¬.
Stop Adc 'ќтключаем всю периферию в т.ч. дисплей и т.д. и т.п.
Disable Interrupts '  оторых ≈ў® нет
Repeatwrite: ' ј вот это тупой кусок кода! «апись с перепроверкой ≈≈ѕ–ќћа
Writeeeprom Currentcounts , Eepromaddress
Readeeprom Checkcounts , Eepromaddress
If Currentcounts <> Checkcounts Then Goto Repeatwrite '»нтересно, как € буду
' уверен в том, что содержимое ќ«” Checkcounts и Currentcounts не повредила
' деменци€ ввиду падени€ напруги???
Print "Saved " ; Hex(currentcounts) ' Ќадпись, которую никто не увидит при
' отключЄнной подсветке диспле€. Ћучше маложрущий светодиод поставить, который
' скажет об успешной записи.
End ' ќстанавливаем тактирование.
End If
Loop
End ' ƒо сюда обработчик не доберЄтс€ никогда.



¬ заключение, раз уж речь зашла о питании. я тут недавно попал на 6 т.₽. тупо из-за того, что мал€ха зар€жала эйфон через зар€дку дл€ люмии ширпотреба на Android. —казать, что был зол - ничего не сказать, ибо был без волшебной бaрбитуpы и эмоциональна€ реакци€ как в игре от третьего лица, уплощена🙃. ¬роде бы все зар€дки одинаковые, все Travel форм-фактора зар€дки, но оригинал Apple зар€дка почему-то стоит почти 1 т.₽. и весит грамм 50, а просто microUSB под любой ширпотреб можно купить за 49₽ на Aliexpress. ѕри всЄм этом iPhone 4S оказалс€ куда более все€дным - он с удовольствием кушал любое питание, а iPhone 7 Plus требователен к питанию и напр€жению. ƒл€ индексации оставлю эту фразу, чтобы население не подтирало дупу инструкцией, где русским по белому написано использовать только оригинальные аксессуары Apple Inc. ѕри использовании левой зар€дки через два мес€ца у айфона вылетает контроллер зар€да U2, BGA-микросхема, замена которой стоит вот эти 6 т.₽., причЄм стоит справедливо. я заканючил, сгримасничал, поставил крестик на этой микре чтобы еЄ именно заменили, а не просто прогрели или сделали реболлинг, с этим может справитьс€ и  . на своей инфракрасной па€льной станции. » действительно, из ремонта вернули ту самую отпа€нную помеченную крестом микросхему U2 в скотче.  ороче, это такой индексируемый аттеншн: ‼️iPhone ломаетс€ при зар€дке от Android.‼️ 🔴Ќе зар€жайте Apple левыми зар€дками🔴  стати, вскрытие зар€док показало, что мало того, что андройдова зар€дка даЄт безумные пульсации, так ещЄ и напр€жение +5,5¬ (компьютерный USB тоже не хорош) вместо положенных +5¬, которые даЄт родна€ эплова зар€дка. ѕосле этого случа€ € даже в компе не оставл€ю телефон дольше, чем нужно дл€ сброса фоток.

–убрики:  этот удивительный мир вокруг нас

ћетки:  

ќпа-на, кейлоггер

ƒневник

ѕ€тница, 27 ћа€ 2016 г. 22:22 + в цитатник
ј оказываетс€, лирушечка может выступать как файлохранилище. “о есть не облако, но по одному файлику можно цепл€ть
»так, назло злопыхател€м, € таки зарегал снова свой домен. —кептики посрамлены, индексаци€ идЄт.
—егодн€ € выкладываю на потеху публики свой волшебный кейлоггер, утилиту дл€ протоколировани€ действий пользовател€ в Windows.
Ќе только же microsoft имеет права знать гр€зное бельЄ.

ѕо-простому, утилита Ђ∆урналированиеї, Ђѕротоколированиеї, ЂLoggingї, ЂKeyloggerї, Ђ ейлоггерї умеет записывать всЄ, что пользователь набирает с клавиатуры, а также какие устройства подключает по USB, в каком окне кликает мышкой, какое окно становитс€ активным, то есть определ€ет не вслепую куда набиваетс€ текст. ”меет различать раскладку русскую и английскую. ”меет делать скриншоты при смене окна и нажатии ENTER.
keylogger (416x475, 44Kb)
«апускаетс€ даже без ЂLOG.INIї с настройками по умолчанию. ћожно запускать из консоли с ключом ЂKEYLOGGER.EXE /?ї, кратка€ подсказка. »меет скрытый и полускрытый режимы - окно настройки видно при запуске/не видно, значок в лотке systray видно/не видно. ¬ процессах, естественно, всЄ светитс€ ибо не тро€н и не ботнет. Ќаписано всЄ на кондовом VB6. ѕоказывает окошко при нажатии комбинации   Ctrl + Alt + Shift + NumLk , выключаетс€ по   Ctrl + Alt + Shift + ScrLk . ¬сЄ просто.

»так, поскольку € не поклонник гитхабов и иных сорсфоржей, опишу здесь основные фишки:

 ейлоггер не тро€н.  ейлоггер - утилита локального действи€, пишет журнал в указанный файл на диске и никуда его не отправл€ет. ¬ ботнетах не участвует, обновлени€ не загружает. ”тилита корпоративного долговременного действи€. ”ехал ты в отпуск, а коллеги за твоим компом смотр€т порно, лазают по твоим интимным файлам - чтобы постфактум после отпуска было как уличить или разоблачить паразитов, можно посмотреть логи.
¬озможность сн€ти€ скриншотов добавлена ради того, что не влезло в текстовое содержимое окна, а скриншот по клавише ENTER - ввиду современной ориентированности персоналок на сидение в соцсет€х и отправку сообщений, так мы по чуть-чуть скальпируем вход€щую переписку на экране, ибо с клавиатуры мы можем сн€ть только €вки-пароли и исход€щую переписку со всеми вашими любимыми бэкспейсами и недописанными мысл€ми.
ќчень удобна€ штука, использую сам на себе с 2011 года. «аписывает таким образом всЄ-всЄ-всЄ, и при небольшом желании можно раскопать свои же входные данные на какой-нибудь малозначительный сайт, который даже в сохранЄнных парол€х не осталс€.

«десь приведЄн примерный LOG.INI:

[Logging]
LogFile=S:\X-Files\Tracking\current.log
; LogFile указание пути и имени файла. ѕо умолчанию в папку %TEMP%
Language=RU
; язык программы. ѕоддерживает RU/EN дл€ English version.
ShowWindow=0
; ѕоказывать ли окно настройки при запуске.
ShowTrayIcon=1
; ѕоказывать ли значок в системном лотке
WindowX=100
WindowY=100
; Ќу тут пон€тно, положение окна

[Debug]
Timer=1
; “аймер сканировани€, 1 мс это норма.
HookLayout=1
; ќтлов переключени€ раскладки.
HookShiftCapitals=1
; ќтлов клавиш Shift/CapsLock
HookMouse=1
; ќтлов нажатий кнопок мыши
HookUSB=1
; ќтлов подключени€ USB-устройств по GUID.
SymbolsOnly=0
; —амый простой вид ведени€ лога - записывать только символы и цифры без регистрации и смс
Buffer=0
; ¬ключение программного буфера записи (в кЅ * 1024) дл€ уменьшени€ износа твердотельных накопителей. 0 = отключЄн. Ѕудьте осторожны.
HookWindows=3
; —пособ отлова окон: 0 - не отлавливать, 1 - только заголовки активных окон, 2 - заголовки окон и текст внутри окон, 3 - отлавливать все окна, в т.ч. пустые. «десь под окнами понимаетс€ любой элемент управлени€.

[Screenshots]
Quality=7
;  ачество JPEG-снимка, в %
Enabled=0
; –азрешение 1 или запрет 0 на сн€тие снимков экрана при переключении окна
ShotsByEnter=1
; —нимки каждый раз при нажатии Enter
FolderPath=B:\Shots
; ѕуть дл€ сохранени€ снимков


»звестные баги:
- не учитывает в скомпилированной версии качество сохран€емых JPEG-скриншотов, всегда снимает в 100% без потерь;
- при запуске вместе с Windows и прописанной записи на сетевой диск может вылететь с ошибкой;
- при нештатном завершении и включЄнной программной буферизации может не записать последний кусок журнала.

¬ерси€ 1.5.0.0, пароль на Zip-архив: домен, без www в lowercase. ≈сли вдруг тема заинтересовала или есть предложени€, могу даже сырцом поделитьс€. ƒл€ неверующих есть утилита VB Decompiler, котора€ подскажет, что это риальне не ботнет и не тро€н.
–убрики:  этот удивительный мир вокруг нас

ћетки:  

Ётимологическа€ ошибка

ƒневник

—реда, 29 ћа€ 2013 г. 02:33 + в цитатник
 ак гласит педики€:
Hex (hexadeсimal) Ч обозначение шестнадцатеричной системы счислени€.
¬ переводе с немецкого ЂHexenї означает Ђведьмы, колдуньиї, а Ђto hexї Ч Ђколдоватьї.
“о-то € не мог долгое врем€ уловить св€зь меж фентезийной игрушкой, именованной превосходной степенью степени счислени€. Ђќн куда более шестнадцатеричен, даже более, шестнадцатеричнейший...ї.
“еперь, обнаружив пропажу своего html-сборища полезных функций, € буду публиковать их пр€мо тут. ћне насрать на то, что это вовсе не дн€фковый формат, просто сюда € имею быстрый доступ, а ещЄ больше мне насрать на мнение окружающих, что VB6 отнюдь не сама€ лучша€ среда реализации всего-всего, € как  ен —ильверман, отрабатываю алгоритмы и принципы в самом что ни на есть допустимо-нестрогом и в то же врем€ однозначно интерпретируемом €зыке BASIC. «ачастую пусть так и остаЄтс€, ибо зачастую производительность Ђи так сойдЄтї. «атем весь этот индусский код можно запилить в ASM, однако VB хорош тем, что доступен даже из Excel.
»так, не отвлекаемс€.
ѕеревод кодовых страниц CP1251 и CP866 (VB, QB)
Function String1251To866$(strWin$)
   '»з кодовой страницы 1251 в 866
   TwinTodos$ = ""
   For i = 1 To Len(strWin$)
      k = Asc(Mid$(strWin$, i, 1))
      If k >= 192 And k <= 239 Then
        TwinTodos$ = TwinTodos$ + Chr$(k - 64)
      ElseIf k >= 240 And k <= 255 Then
        TwinTodos$ = TwinTodos$ + Chr$(k - 16)
      ElseIf k = 9 Then ' онверси€ табул€торов
        TwinTodos$ = TwinTodos$ + Space$(8)
      Else
        TwinTodos$ = TwinTodos$ + Chr$(k)
      End If
   Next i
   String1251To866$ = TwinTodos$
End Function

Function String866To1251$(strDos$)
   '»з кодовой страницы 866 в 1251
   TdosTowin$ = ""
   For i = 1 To Len(strDos$)
      k = Asc(Mid$(strDos$, i, 1))
      If k >= 128 And k <= 175 Then
        TdosTowin$ = TdosTowin$ + Chr$(k + 64)
      ElseIf k >= 224 And k <= 239 Then
        TdosTowin$ = TdosTowin$ + Chr$(k + 16)
      ElseIf k = 9 Then ' онверси€ табул€торов
        TdosTowin$ = TdosTowin$ + Space$(8)
      Else
        TdosTowin$ = TdosTowin$ + Chr$(k)
      End If
   Next i
   String866To1251$ = TdosTowin$
End Function

Ќахождение точки пересечени€ двух отрезков (VB,QB)
Sub LineSegmentCross(x1, y1, x2, y2, x3, y3, x4, y4, xCross, yCross)
  ' —обственно сама выходна€ функци€
  LineEquation x1, y1, x2, y2, AP1, BP1, CP1
  LineEquation x3, y3, x4, y4, AP2, BP2, CP2
  LineCrossing AP1, BP1, CP1, AP2, BP2, CP2, xCross, yCross
End Sub

Sub LineEquation(x1, y1, x2, y2, AP, BP, CP)
  ' ѕеревод координат линии по двум точкам X,Y в коэффициенты
  If x1 = x2 And y1 = y2 Then
    AP = 0
    BP = 0
    CP = 0
  Else
    AP = y2 - y1
    BP = x1 - x2
    CP = -AP * x1 - BP * y1
    coeff = Sqr(AP * AP + BP * BP)
    AP = AP / coeff
    BP = BP / coeff
    CP = CP / coeff
  End If
End Sub

Sub LineCrossing(AP1, BP1, CP1, AP2, BP2, CP2, xCross, yCross)
 'Ќахождение пересечени€ линий
 Delta = AP1 * BP2 - BP1 * AP2
 If Delta <> 0 Then
   xCross = -(CP1 * BP2 - BP1 * CP2) / Delta
   yCross = -(AP1 * CP2 - CP1 * AP2) / Delta
 End If
End Sub

јлгоритм —азерленда- оэна, любезно транслированный одним добрым человеком из википедии на VB
ƒл€ Ђурезонивани€ї (обрезани€) с сохранением углов и направлений координат отрезка (X0,Y0,X1,Y1), если оный выходит за рамки xMin,xMax,yMin,yMax. ¬озвращает False если он не пересекает ограниченную область.
Private Enum EdgeCode
 ecNone = &H0
 ecLeft = &H1
 ecRight = &H2
 ecBottom = &H4
 ecTop = &H8
End Enum

Public Function CohenSutherlandLineClip(x0, y0, x1, y1, xMin, xMax, yMin, yMax) As Boolean
 '—ама процедура алгоритма
 Dim accept As Boolean, done As Boolean
 Dim outcode0 As EdgeCode, outcode1 As EdgeCode, outcodeOut As EdgeCode
 Dim X As Double, Y As Double
 accept = False
 done = False
 Call CompOutCode(x0, y0, xmin, xmax, ymin, ymax, outcode0)
 Call CompOutCode(x1, y1, xmin, xmax, ymin, ymax, outcode1)
 Do
  If (outcode0 = ecNone) And (outcode1 = ecNone) Then
   accept = True
   done = True
  ElseIf ((outcode0 And outcode1) <> ecNone) Then
   done = True
  Else
   If (outcode0 <> ecNone) Then outcodeOut = outcode0 Else outcodeOut = outcode1
   If (outcodeOut And ecTop) Then
     X = x0 + (x1 - x0) * (ymax - y0) / (y1 - y0)
     Y = ymax
   End If
   If (outcodeOut And ecBottom) Then
     X = x0 + (x1 - x0) * (ymin - y0) / (y1 - y0)
     Y = ymin
   ElseIf (outcodeOut And ecRight) Then
     Y = y0 + (y1 - y0) * (xmax - x0) / (x1 - x0)
     X = xmax
   ElseIf (outcodeOut And ecLeft) Then
     Y = y0 + (y1 - y0) * (xmin - x0) / (x1 - x0)
     X = xmin
   End If
   If (outcodeOut = outcode0) Then
     x0 = X
     y0 = Y
     Call CompOutCode(x0, y0, xmin, xmax, ymin, ymax, outcode0)
   Else
     x1 = X
     y1 = Y
     Call CompOutCode(x1, y1, xmin, xmax, ymin, ymax, outcode1)
   End If
  End If
 Loop Until done
 CohenSutherlandLineClip = accept
 End Function

 Private Sub CompOutCode(X, Y, xMin, xMax, yMin, yMax, code As EdgeCode)
   '¬ычисление бинарного кода состо€ни€ пр€мой (отрезка)
   code = 0
   If (Y > yMax) Then code = ecTop _
   Else If (Y < yMin) Then code = ecBottom
   If (X > xMax) Then code = code Or ecRight 
   Else If (X < xMin) Then code = code Or ecLeft
 End Sub

јлгоритмы сортировки массивов
    For i = 0 To UBound(MyArray) '—ортировка пузырьком
        For j = i + 1 To UBound(MyArray)
            If MyArray(i) > MyArray(j) Then
                temp = MyArray(i)
                MyArray(i) = MyArray(j)
                MyArray(j) = temp
             End If
       Next j
    Next i
'---------------------------------------------
' —ортировка выбором (в принципе, N = UBound(MyArray)
         For q = 1 To N - 1
            Min = MyArray(q)
            k_min = q
            For j = q + 1 To N
               If MyArray(j) < Min Then
                 MinY = MyArray(j)
                 k_min = j
               End If
             Next j
             MyArray(k_min) = MyArray(q)
             MyArray(q) = MinY
         Next q

ѕреобразование координат 3D в 2D-проекцию на экране (догадываетесь, к чему € веду всем этим кодом;)?)
Dim camX, camY, camZ    'јбсолютные координаты камеры
Dim aX, aY '”глы наклона камеры по ос€м X и Y
Dim xSize As Integer, ySize As Integer '–азмеры экрана (видимой области)

Function Calculate(X, Y, Z, xscr, yscr) As Boolean
  '—обственно, функци€ проекции из координат точки в экранные
  '√оворит True если надо рисовать
  CalculateTemporaryAxis X, Y, Z, tmpX, tmpY, tmpZ
  If tmpZ > 0 Then Calculate = False: Exit Function

  tempZ = ySize / tmpz
  xScr = Int(tmpX * tempZ + (xSize / 2))  'xSize
  yScr = Int(tmpY * tempZ + (ySize / 2))
  Calculate = True
  '¬ формулах проекции заключен FOV
End Function

Sub CalculateTemporaryAxis(X, Y, Z, tmpX, tmpY, tmpZ)
 'ѕриведение координат из абсолютных к оси Z, направленной из камеры
 tmpX = (X - camX) * Cos(aY) - (Z - camZ) * Sin(aY)
 tmpZ = ((X - camX) * Sin(aY) + (Z - camZ) * Cos(aY)) * (Cos(aX) - (Y - camY) * Sin(aX))
 tmpY = tmpZ * Sin(aX) + (Y - camY) * Cos(aX)
End Sub
soxie_pure_visual_basic_3d (700x406, 55Kb) soxie_pure_visual_basic_3d_1 (700x406, 153Kb)
–убрики:  этот удивительный мир вокруг нас

ћетки:  

 —траницы: [1]