, respectively.
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.graphics import Line, Color
from kivy.clock import Clock
from kivy.core.image import Image as CoreImage
from PIL import Image, ImageDraw, ImageFont
import io
import os
import numpy as np
from kivy.lang import Builder
Builder.load_file(
os.path.join(os.path.dirname(os.path.abspath(
__file__)), 'File.kv')
);
#Avoid Form1 of being resizable
from kivy.config import Config
Config.set("graphics","resizable", False);
Config.set('graphics', 'width', '480');
Config.set('graphics', 'height', '680');
D=1000;
VX1=180; VY1=200; VZ1=0;
VX2=200; VY2=200; VZ2=0;
ShiftX=VX1; ShiftY=-VY1;
#Number of pixels for representing the function
N=100;
x=np.zeros(N+1); z=np.zeros(N+1); y=np.zeros(N+1);
L=50; Pi=np.pi;
for n in range (0,N+1):
x[n]=L*np.sin(6*Pi/N*n);
z[n]=L*np.cos(6*Pi/N*n) +D/2;
for n in range(0,N+1):
y[n]=n/N*100;
PointList=np.zeros( (N+1,2) );
def GraphFunction(VX,VY,VZ,Which):
global x,y, z, N;
if (Which==0):
r,g,b = 250, 0, 0; #red Image
Draw=Draw1
else:
r,g,b= 0, 250, 250; #cyan image
Draw=Draw2
for n in range (0,N+1): #Drawing
Factor=(D-VZ)/(D-z[n]-VZ);
xA=XC+Factor*(x[n]-VX)+VX+ShiftX;
yA=YC-Factor*(y[n]-VY)-VY+ShiftY;
PointList[n]=xA,yA;
List=tuple( map(tuple,PointList) );
Draw.line( List, fill=(r,g,b), width=6 );
def ShowScene(B):
Array1=np.array(PilImage1);
Array2=np.array(PilImage2);
Array3=Array1 | Array2;
PilImage3=Image.fromarray(Array3);
Memory=io.BytesIO();
PilImage3.save(Memory, format="png");
Memory.seek(0);
ImagePNG=CoreImage(Memory, ext="png");
B.ids.Screen1.texture=ImagePNG.texture;
ImagePNG.remove_from_cache()
Memory.close();
PilImage3.close();
Array1=None;
Array2=None;
Array3=None;
def ClearObjects():
Draw1.rectangle( (0, 0, W-10, H-10),
fill=(60, 70, 30, 1) );
Draw2.rectangle( (0, 0, W-10, H-10),
fill=(60, 70, 30, 1) );
def RotateFunction(B, Sense):
global x,y,z,D,N
if Sense==-1:
Teta=np.pi/180*(-0.1);
else:
Teta=np.pi/180*(0.1);
Cos_Teta=np.cos(Teta)
Sin_Teta=np.sin(Teta);
X0=0; Y0=0; Z0=D/2 # Center of rotation
for n in range(0,N+1):
for m in range(0,N+1):
if (B.ids.Button3.state=="down" or
B.ids.Button4.state=="down"):
yP=(y[n]-Y0)*Cos_Teta
+ (x[n]-X0)*Sin_Teta +Y0;
xP=-(y[n]-Y0)*Sin_Teta
+(x[n]-X0)*Cos_Teta + X0;
y[n]=yP;
x[n]=xP;
if (B.ids.Button5.state=="down" or
B.ids.Button6.state=="down"):
yP=(y[n]-Y0)*Cos_Teta
+ (z[n]-Z0)*Sin_Teta + Y0;
zP=-(y[n]-Y0)*Sin_Teta
+(z[n]-Z0)*Cos_Teta + Z0;
y[n]=yP;
z[n]=zP;
if (B.ids.Button7.state=="down" or
B.ids.Button8.state=="down"):
xP=(x[n]-X0)*Cos_Teta
+ (z[n]-Z0)*Sin_Teta + X0;
zP=-(x[n]-X0)*Sin_Teta
+(z[n]-Z0)*Cos_Teta + Z0;
x[n]=xP;
z[n]=zP;
class Form1(FloatLayout):
def __init__(Handle, **kwargs):
super(Form1, Handle).__init__(**kwargs);
Event1=Clock.schedule_once(
Handle.Initialize);
def Initialize(B, *args):
global W,H, XC,YC;
global PilImage1,PilImage2, Draw1,Draw2;
# P= Percentage of the D distance
global P, Amplitude;
W,H=B.ids.Screen1.size;
XC=int (W/2)+20;
YC=int(H/2)+60;
PilImage1= Image.new('RGB', (W-10, H-10),
(60, 70, 30));
Draw1 = ImageDraw.Draw(PilImage1);
PilImage2= Image.new('RGB', (W-10, H-10),
(60, 70, 30));
Draw2 = ImageDraw.Draw(PilImage2);
Font = ImageFont.truetype('Gargi.ttf', 70);
Draw1.text( (30,200), "3D Images", fill =(
255,0,0,1), font=Font);
Draw2.text( (50,200), "3D Images", fill =
(0,255,255,1), font=Font);
ShowScene(B);
def Button1_Click(B):
global Draw1, Draw2;
ClearObjects(); # Clearing Draw1 and Draw2
GraphFunction(VX1,VY1,VZ1,0);
GraphFunction(VX2,VY2,VZ2,1);
ShowScene(B);
def Button2_Click(B):
ClearObjects(); # Clearing Draw1 and Draw2
Font = ImageFont.truetype('Gargi.ttf', 70)
Draw1.text( (30,200), "3D Images", fill =
(255,0,0,1), font=Font);
Draw2.text( (50,200), "3D Images", fill =
(0,255,255,1), font=Font);
ShowScene(B);
def Button3_Click(B):
RotateFunction(B,1);
ClearObjects(); # Clearing Draw1 and Draw2
GraphFunction(VX1,VY1,VZ1,0);
GraphFunction(VX2,VY2,VZ2,1);
ShowScene(B);
def Button4_Click(B):
RotateFunction(B,-1),
ClearObjects();
GraphFunction(VX1,VY1,VZ1,0);
GraphFunction(VX2,VY2,VZ2,1);
ShowScene(B);
def Button5_Click(B):
RotateFunction(B,-1),
ClearObjects();
GraphFunction(VX1,VY1,VZ1,0);
GraphFunction(VX2,VY2,VZ2,1);
ShowScene(B);
def Button6_Click(B):
RotateFunction(B,1),
ClearObjects();
GraphFunction(VX1,VY1,VZ1,0);
GraphFunction(VX2,VY2,VZ2,1);
ShowScene(B);
def Button7_Click(B):
RotateFunction(B,-1),
ClearObjects();
GraphFunction(VX1,VY1,VZ1,0);
GraphFunction(VX2,VY2,VZ2,1);
ShowScene(B);
def Button8_Click(B):
RotateFunction(B,1),
ClearObjects();
GraphFunction(VX1,VY1,VZ1,0);
GraphFunction(VX2,VY2,VZ2,1);
ShowScene(B);
# This is the Start Up code.
class StartUp (App):
def build (BU):
BU.title="Form1"
return Form1();
if __name__ =="__main__":
StartUp().run();
Listing 10-5Code for the main.py File