PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Залип на программе


Залип на программе

Сообщений 1 страница 15 из 15

1

Код:
If OpenWindow(0, 0, 0, 640, 480, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 640, 480)
  
  Q.f=0.755/8
  Z.f=0.636363/8
  C.f=0.527225
  
  If StartDrawing(CanvasOutput(0))
    Box(0,0,640,480,0)
    For X=0 To 1280 Step 2
      For Y=0 To 1000 Step 2
        V.f=(X+4*Y)/500
        W.f=(X-Y+450)/200
        F.f=1
        If (X>70 And X<430 And Y>300 And Y<900)Or((X-250)*(X-250)/8+(Y-300)*(Y-300)<4000)
          F=1-X/250
          ;F=F*(F>0)
          If f<0
            f=0
          EndIf
        EndIf
        If (X-250)*(X-250)/8+(Y-900)*(Y-900)<4000
          F=0
        EndIf
        If F=1 And V>1 And V<7 And W>0 And W<6
          If X>250 And X-3*Y>-900 And X-8*Y<-1600
            flx=1
          Else
            flx=0
          EndIf
          F=0.5+0.25*(Mod(W+V,2))-0.25*flx;(X>250 And X-3*Y>-900 And X-8*Y<-1600)
        EndIf
        I.f=Q*X+Z*Y+C
        I=I-Int(I)
        If F-Int(F)>I
          fli=1
        Else
          fli=0
        EndIf
;If Int(F)-(F-Int(F)>I) And 1 Then Pixel X\2,500-Y\2
        If Int(F)-fli&1
          Box(X/2,500-Y/2,1,1,$FFFFFF)
        EndIf
      Next Y 
    Next X
    StopDrawing()
  EndIf
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf

поле должно быть шахматным
причина в

Код:
If Int(F)-(F-Int(F)>I) And 1 Then Pixel X\2,500-Y\2

Нужна помощь, соображалка не фунциклирует

0

2

Оригинал программы

Код:
https://www.thebackshed.com/forum/ViewTopic.php?TID=17161&P=9
Q=.755/8
Z=.636363/8
C=.527225
For X=0 To 1280 Step 2
For Y=0 To 1000 Step 2
V=(X+4*Y)\500
W=(X-Y+450)\200
F=1
If (X>70 And X<430 And Y>300 And Y<900)Or((X-250)*(X-250)/8+(Y-300)*(Y-300)<4000) Then
 F=1-X/250:F=F*(F>0)
EndIf
If (X-250)*(X-250)/8+(Y-900)*(Y-900)<4000 Then F=0
If F=1 And V>1 And V<7 And W>0 And W<6 Then
 F=.5+.25*((W+V)Mod 2)-.25*(X>250 And X-3*Y>-900 And X-8*Y<-1600)
EndIf
I=Q*X+Z*Y+C
I=I-Int(I)
If Int(F)-(F-Int(F)>I) And 1 Then Pixel X\2,500-Y\2
Next :Next

0

3

Int(F)-(F-Int(F)>I) And 1
И в каком языке такая конструкция внутри If then работает?
Что то тут на мой взгляд странное.

0

4

useful написал(а):

Int(F)-(F-Int(F)>I) And 1
И в каком языке такая конструкция внутри If then работает?
Что то тут на мой взгляд странное.

Это Picomite для Picocalc.
Странное или нет - некоторые диалекты грешат подобными записями. Я переводил код с justBASIC на родной - чокнешься.

0

5

Ну если Int(F)>I должно давать 0 или 1 то и выделить это вычисление из выражения и заменить потом в выражении на 0 или 1
или использовать bool()
Syntax
Result = Bool(<boolean expression>)

Description

Bool can be used to evaluate a boolean expression outside of regular conditional operator like If, While, Until etc.

Parameters

boolean expression The Boolean expression to test. 

Return value

Returns #True if the boolean expression is true, #False otherwise.

Example

  Hello$ = "Hello"
  World$ = "World"

  Debug Bool(Hello$ = "Hello")  ; will print 1
  Debug Bool(Hello$ <> "Hello" Or World$ = "World") ; will print 1

Отредактировано useful (22.08.2026 18:47:34)

0

6

useful написал(а):

If F-Int(F)>I
          fli=1
        Else
          fli=0
        EndIf

Так и написано. Загвоздка в проверке ниже

Код:
        If F-Int(F)>I
          fli=1
        Else
          fli=0
        EndIf

0

7

Я понятия не имею насколько это работоспособно, на мой взгляд нужно очень внимательно следить за типами переменных, но через bool()
удалось выразить оригинал почти буква в букву.
Q.f = 0.755/8
Z.f = 0.636363/8
C.f = 0.527225
For X=0 To 1280 Step 2
  For Y=0 To 1000 Step 2
    V.f = (X+4*Y)/500
    W.f = (X-Y+450)/200
    F.f = 1
    If (X>70 And X<430 And Y>300 And Y<900) Or
       ((X-250)*(X-250)/8+(Y-300)*(Y-300) < 4000)
      F=1-X/250
      F=F*Bool(F>0)
    EndIf
    If (X-250)*(X-250)/8+(Y-900)*(Y-900) < 4000
      F=0
    EndIf 
    If F=1 And V>1 And V<7 And W>0 And W<6
      F=0.5 + 0.25 * (Mod(W+V,2)) - 0.25 * Bool(X>250 And (X-3*Y) > -900 And (X-8*Y) < -1600)
    EndIf
    I=Q*X+Z*Y+C
    I=I-Int(I)
    If Int(F)-(F-Bool(Int(F)>I)) And 1
      ;Pixel X\2,500-Y\2
    EndIf 
  Next
Next

0

8

https://upforme.ru/uploads/0009/ae/28/618/t415552.png
С этим тоже диагонали. Оригинал рисунка

0

9

Нужно понимать как оригинал работает с типами, есть ли ещё например разница в / \ а они встречаются. Может это разное деление?

0

10

useful написал(а):

Нужно понимать как оригинал работает с типами, есть ли ещё например разница в / \ а они встречаются. Может это разное деление?

так и есть. спасибо за помощь

Код:
If OpenWindow(0, 0, 0, 640, 480, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 640, 480)
  
  Q.f=0.755/8
  Z.f=0.636363/8
  C.f=0.527225
  
  If StartDrawing(CanvasOutput(0))
    Box(0,0,640,480,0)
    For X=0 To 1280 Step 2
      For Y=0 To 1000 Step 2
        V=(X+4*Y)/500
        W=(X-Y+450)/200
        F.f=1
        If (X>70 And X<430 And Y>300 And Y<900)Or((X-250)*(X-250)/8+(Y-300)*(Y-300)<4000)
          F=1-X/250
          ;F=F*(F>0)
          F=F*Bool(F>0)
        EndIf
        If (X-250)*(X-250)/8+(Y-900)*(Y-900)<4000
          F=0
        EndIf
        If F=1 And V>1 And V<7 And W>0 And W<6
          ;F=0.5+0.25*(Mod(W+V,2))-0.25*flx;(X>250 And X-3*Y>-900 And X-8*Y<-1600)
          F=0.5 + 0.25 * (Mod(W+V,2)) - 0.25 * Bool(X>250 And (X-3*Y) > -900 And (X-8*Y) < -1600)
        EndIf
        I.f=Q*X+Z*Y+C
        I=I-Int(I)
        ;If Int(F)-(F-Int(F)>I) And 1 Then Pixel X\2,500-Y\2
        If Int(F)-Bool(F-Int(F)>I) & 1
          Box(X/2,500-Y/2,1,1,$FFFFFF)
        EndIf
      Next Y 
    Next X
    StopDrawing()
  EndIf
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf

0

11

отключить dpi!!! 641 и 501 потому, что начинаем с 0

Код:
xp.i = 0
yp.i = 0
xpmax.i = 0
xpmin.i = 0
ypmax.i = 0
ypmin.i = 0

If OpenWindow(0, 0, 0, 641, 501, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 641, 501)
  
  Q.f=0.755/8
  Z.f=0.636363/8
  C.f=0.527225
  
  If StartDrawing(CanvasOutput(0))
    Box(0,0,641,501,0)
    For X=0 To 1280 Step 2
      For Y=0 To 1000 Step 2
        V=(X+4*Y)/500
        W=(X-Y+450)/200
        F.f=1
        If (X>70 And X<430 And Y>300 And Y<900)Or((X-250)*(X-250)/8+(Y-300)*(Y-300)<4000)
          F=1-X/250
          ;F=F*(F>0)
          F=F*Bool(F>0)
        EndIf
        If (X-250)*(X-250)/8+(Y-900)*(Y-900)<4000
          F=0
        EndIf
        If F=1 And V>1 And V<7 And W>0 And W<6
          ;F=0.5+0.25*(Mod(W+V,2))-0.25*flx;(X>250 And X-3*Y>-900 And X-8*Y<-1600)
          F=0.5 + 0.25 * Mod(W+V,2) - 0.25 * Bool(X>250 And (X-3*Y) > -900 And (X-8*Y) < -1600)
        EndIf
        I.f=Q*X+Z*Y+C
        I=I-Int(I)
        ;If Int(F)-(F-Int(F)>I) And 1 Then Pixel X\2,500-Y\2
        If Int(F)-Bool(F-Int(F)>I) And 1
          xp = X/2: yp = 500-Y/2
          
          If xp > xpmax : xpmax = xp : EndIf
          If xp < xpmin : xpmin = xp : EndIf
          If yp > ypmax : ypmax = yp : EndIf
          If yp < xpmin : ypmin = yp : EndIf
          
          Plot(xp,yp,$FFFFFF)
        EndIf
      Next Y 
    Next X
    StopDrawing()
    Debug xpmin
    Debug xpmax
    Debug ypmin
    Debug ypmax
  EndIf
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf

Отредактировано useful (23.08.2026 09:58:18)

0

12

Забавно, но замена Mod(W+V,2) на (W+V)%2 не проходит.

0

13

Result.f(.d) = Mod(Number.f(.d), Divisor.f(.d))
Это версия оператора '%' для целых чисел с плавающей запятой. Эта функция обрабатывает и возвращает значения типа float или double.
This is the floating-point version of the '%' operator for integers. This function handles and returns float or double values.

Debug 17 % 2
Debug Mod(17.0,2.0)

1
1.0

Отредактировано useful (23.08.2026 17:44:34)

0

14

здесь как раз и не нужна эта функция, только целые числа.

0

15

особенность разбора выражения результат которого присваивается не целому и внутри есть не целые.

Код:
          aaa.i = (W+V)%2
          bbb.i = Bool(X>250 And (X-3*Y) > -900 And (X-8*Y) < -1600)
          F=0.5 + 0.25 * aaa - 0.25 * bbb

p.s.
Можно Фрэду написать про это

Код:
Debug 0.5 * (6%5) ;ok
Debug 5 * ((7-1)%5) ;ok
;Debug 0.5 * ((7-1)%5) ; err!!!
Debug 0.5 * Mod((7-1),5) ;ok

https://www.purebasic.fr/english/viewtopic.php?t=89426

Отредактировано useful (Вчера 12:31:54)

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Залип на программе