PureBasic - форум

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

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


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


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

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

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 (24.08.2026 12:31:54)

0

16

финал, только с небом косяки

Код:
https://forum.clockworkpi.com/t/basic-programs-from-thebackshed-on-picocalc/18066

Dim CM(15)=(RGB(0,0,0),RGB(0,0,255),RGB(0,64,0),RGB(0,64,255),RGB(0,128,0),RGB(0,128,255),RGB(0,255,0),RGB(0,255,255),RGB(255,0,0),RGB(255,0,255),RGB(255,64,0),RGB(255,64,255),RGB(255,128,0),RGB(255,128,255),RGB(255,255,0),RGB(255,255,255))
W=0:E=Sqr(3):F=Sqr(7):Dim S(180)

For I=0 To 180: S(I)=Sin(Rad(2*I)): Next

For X=0 To 319
 For Y=0 To 240
   K=32:G=0

   For H=1 To 2
     A=(X+180)/K: B=Y/K: C=Int(A): D=Int(B)
     G=G+(FNS(C,D)+FNS(C+1,D)+FNS(C,D+1)+FNS(C+1,D+1))
     K=K/2
   Next

   G=Int((G+W+X/320)/3)*15
   If G=0 Then
     G=7
     If (X+Y)/416>W Then G=1
   EndIf

   If Y<20*(S((X*.4+20)Mod 180)+3) Then
     G=6
     If S(((X+3*Y)/4+10)Mod 180)<W Then G=2
   EndIf

   Color CM(G)
   Pixel X,240-Y

   W=W+E-Int(W+E)
 Next
Next

Function FNS(U,V)
 Q=(U*E+V*F)-Int(U*E+V*F)
 T=1-(A-U)*(A-U)-(B-V)*(B-V)
 If T<=0 Then FNS=0 Else FNS=(3-2*T)*T*T*Q
End Function
Код:
Dim CM(15)
cm(0)=RGB(0,0,0)
cm(1)=RGB(0,0,255)
cm(2)=RGB(0,64,0)
cm(3)=RGB(0,64,255)
cm(4)=RGB(0,128,0)
cm(5)=RGB(0,128,255)
cm(6)=RGB(0,255,0)
cm(7)=RGB(0,255,255)
cm(8)=RGB(255,0,0)
cm(9)=RGB(255,0,255)
cm(10)=RGB(255,64,0)
cm(11)=RGB(255,64,255)
cm(12)=RGB(255,128,0)
cm(13)=RGB(255,128,255)
cm(14)=RGB(255,255,0)
cm(15)=RGB(255,255,255)
W.f=0
Global E.f=Sqr(3)
Global F.f=Sqr(7)

Dim S.f(180)
For I=0 To 180
  ;S(I)=Sin(Radian(2*I))
  S(I)=Sin(2*I*#PI/180)
Next I

Global A.f,B.f
Procedure.f FNS(U,V)
  Q.f=(U*E+V*F)-Int(U*E+V*F)
  T.f=1-(A-U)*(A-U)-(B-V)*(B-V)
  If T<=0
    FNS_.f=0
  Else
    FNS_=(3-2*T)*T*T*Q
  EndIf
  ProcedureReturn FNS_
EndProcedure

; Procedure.f s(I.f)
;   ProcedureReturn Sin(Radian(2*I))
; EndProcedure

If OpenWindow(0, 0, 0, 320, 240, "Windows Serenity", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 320, 240)
  If StartDrawing(CanvasOutput(0))
    For X=0 To 319
      For Y=0 To 240
        K=32
        G.f=0
        
        For H=1 To 2
          A=(X+180)/K ;.f
          B=Y/K       ;/f
          C=Int(A)
          D=Int(B)
          G=G+(FNS(C,D)+FNS(C+1,D)+FNS(C,D+1)+FNS(C+1,D+1))
          K=K/2
        Next H
        
        G=Int((G+W+X/320)/3)*15
        If G=0
          G=7;cyan
          If (X+Y)/416>W
            G=1
          EndIf
        EndIf
        
        ;If Y<20*(S((X*0.4+20)Mod 180)+3)
        vv.f=X*0.4+20
        vv=Mod(vv,180)
        If Y<20*( S(Int(vv))+3)
          G=6
          ;If S(((X+3*Y)/4+10)Mod 180)<W
          vv=(X+3*Y)/4+10
          vv=Mod(vv,180)
          If S( Int(vv) )<W
            G=2
          EndIf
        EndIf
        Box(X,240-Y,1,1,CM(Int(G)))
        W=W+E-Int(W+E)
      Next Y
    Next X
    
    StopDrawing()
  EndIf
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf

Отредактировано egons (31.08.2026 17:39:45)

+1

17

https://upforme.ru/uploads/0009/ae/28/618/t228953.jpg

0


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