Правило - альфа она же и омега, иначе путаница в мыслях и коде..
Запись от Hrethgir размещена 15.09.2023 в 22:55
Показов 1306
Комментарии 2
|
[OFF]Впервые шагнул дальше двух итераций, ранее заканчивалось обычно на паре.[/OFF] Ищу остаток чтобы организовать циклы работы движка без каких либо ещё ассемблерных прыжков. Сам движок генератора карт отписан тут немного [url]https://habr.com/ru/articles/743758/[/url] , но это работает, и просто мне не нравится организация циклов внешних, да и этот может сменю проверкой равенства условия нулю [PASCAL]for BFCount :=Biger- 1 downto 0 do begin //lowerCycle: //repeat ////////////////////////////////////////////////////////////////////////////////////////////////// {%REGION 'Engine'} asm JMP p end; p1: StringGrid1.Cells[px^, py^] := IntToStr(pTracerX^) + ',' + IntToStr(pTracerY^) + ',' + '1'; //запись правого столбца p := @p3; goto p4; p2: y1:=y+1; //автоматическое забивание координат в местах скоса трассы p := @p3; goto p5; p3: y1:=y; p5: x1:=x-xInc; StringGrid1.Cells[px^, py^] := IntToStr(px1^) + ',' + IntToStr(py1^) + ',' + '0'; //автоматическое забивание координат трассы на прямых участках p4: x:=x+xInc; {%ENDREGION} end; [/PASCAL] и вот я пытался решить как это сделать не копируя часть [PASCAL] remainderstepsFrequent:=round(remainder/stepFrequent); remainder:=remainder-remainderstepsFrequent*stepFrequent;[/PASCAL] и тут подзатупил и подзавис [PASCAL] if RazmerX>bigStep+stepRare then begin stepsSetapInLine:=trunc(RazmerX / (bigStep+stepRare)); remainder:=RazmerX - stepsSetapInLine*(bigStep+stepRare); if remainder>stepFrequent then begin remainderstepsFrequent:=round(remainder/stepFrequent); remainder:=remainder-remainderstepsFrequent*stepFrequent; end else remainderstepsFrequent:=0; end else begin stepsSetapInLine:=0; remainderstepsFrequent:=0; end;[/PASCAL] А всё просто - значение остатку нужно задавать в самом начале: [PASCAL] remainder:=RazmerX; if remainder>bigStep+stepRare then begin stepsSetapInLine:=trunc(RazmerX / (bigStep+stepRare)); remainder:=RazmerX - stepsSetapInLine*(bigStep+stepRare); end else stepsSetapInLine:=0; if remainder>stepFrequent then begin remainderstepsFrequent:=round(remainder/stepFrequent); remainder:=remainder-remainderstepsFrequent*stepFrequent; end else remainderstepsFrequent:=0; [/PASCAL] Раньше больше двух итераций у меня не было никогда, поэтому значения не придавал. А тут вот - оказывается самое последнее должно быть определно самым первым, факт. Ну вроде всё так. Суть задачи тем кто читал по этому проекту в принципе ясна должна быть. Даже не знаю, правило вроде есть и вроде эффективно, а когда его применишь вроде как и не так важно, важно пока с кодом затупливаешь - понимаешь что есть правило какое-то. То есть это правило поиска остатков, при делении на разные величины, чередующиеся в порядке на одной числовой линейке. Здесь самый-самый остаток это remainder . И фишка в том, что его желательно определять сразу, пусть даже придавая ему самое большое возможное значение, а потом уже уменьшать его при проверках условий. Ну в принципе, кто учит математику тот знаком с понятием глобализма и бесконечности, но я уже на этом проекте настолько зациклился что ряд логических волшебных правил подзабыл, а глобализм как ветром сдуло, и вроде как всё переоткрываешь заново уже для самого себя. Видимо в этом тоже проявляется чудное многообразие вселенной, что порой на давно тебе известное порой смотришь как баран на новые ворота. Но скорее это всё-же от того, что не так часто программируешь новые алгоритмы. |
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 2
Комментарии
-
Запись от Welemir1 размещена 16.09.2023 в 19:35
-
эти строки чисто для отладки, информацию в ячейкахх потом читает парсер и проверяет трассировку на карте. Просто удобно отладку делать, когда помимо проверяющего карту кода ты можешь сам увидеть карту в таблице. В этом весь фокус, что алгоритм генератора карт устроен так, что практиески ничего не считает, а заливает автоматом данные. Есть конечно формулы, но они считают только x+y от площади карты, равной x*y. Естественно такая автоматика и такие расчёты требуют кропотливой отладки, да и ещё вывертов из-за предпочтения математики условностям, когда в формулу приходится включать математическое выражение, заменяющее блок кода проверки условий, но это только одна линия на одной оси координат.Запись от Hrethgir размещена 16.09.2023 в 23:13


