-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
17 changed files
with
974 additions
and
15 deletions.
There are no files selected for viewing
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
<!doctype html> | ||
<html lang="en"> | ||
<head> | ||
<meta charset="utf-8"> | ||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> | ||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||
<title>CSE423/as-3</title> | ||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-iYQeCzEYFbKjA/T2uDLTpkwGzCiq6soy8tYaI1GyVh/UjpbCx/TYkiZhlZB6+fzT" crossorigin="anonymous"> | ||
<link rel="stylesheet" href="../../assets/themes/stackoverflow-dark.min.css"> | ||
<link rel="stylesheet" href="../../assets/style.css"> | ||
</head> | ||
<body> | ||
<div class="title"> | ||
<h2>Lab Assignment-03</h2> | ||
</div> | ||
|
||
<iframe src="https://docs.google.com/viewer?url=https://eniac00.github.io/bracu/CSE423/lab01/as01_ques.pdf&embedded=true" ></iframe> | ||
|
||
<div class="button-container"> | ||
<button type="button" class="btn btn-primary" onclick="loadFile('task_1')">task-1</button> | ||
<button type="button" class="btn btn-primary" onclick="loadFile('task_2')">task-2</button> | ||
</div> | ||
|
||
<div id="sub-title"></div> | ||
|
||
|
||
<div id="code-wrapper"></div> | ||
|
||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-u1OknCvxWvY5kfmNBILK2hRnQC3Pr17a+RTT6rIHI7NnikvbZlHgTPOOmMi466C8" crossorigin="anonymous"></script> | ||
<script src="../../assets/highlight.min.js"></script> | ||
<script> | ||
function loadFile(button_name) { | ||
|
||
document.getElementById('sub-title').innerHTML = ""; | ||
document.getElementById('sub-title').innerHTML = `${button_name}`; | ||
|
||
fetch(`./${button_name}.py`) | ||
.then(function(response) { | ||
return response.text(); | ||
}) | ||
.then(function(data) { | ||
document.getElementById('code-wrapper').innerHTML = ""; | ||
document.getElementById('code-wrapper').innerHTML = `<pre><code class='language-python'>${data}</code></pre>`; | ||
hljs.highlightAll(); | ||
}) | ||
.catch(function(error) { | ||
console.log(error); | ||
}); | ||
} | ||
|
||
</script> | ||
</body> | ||
</html> |
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,177 @@ | ||
#!/usr/bin/env python3 | ||
|
||
|
||
##################################################### | ||
######## CSE423_Lab01_Task01 #################### | ||
######## Abir Ahammed Bhuiyan ################## | ||
######## 20101197 ################ | ||
######## section: 01 ############## | ||
########################################## | ||
|
||
|
||
from OpenGL.GL import * | ||
from OpenGL.GLUT import * | ||
from OpenGL.GLU import * | ||
|
||
import random | ||
|
||
|
||
|
||
class Rain: | ||
def __init__(self, x1, y1, x2, y2): | ||
self.x1 = x1 | ||
self.y1 = y1 | ||
self.x2 = x2 | ||
self.y2 = y2 | ||
|
||
|
||
|
||
class RainScene: | ||
def __init__(self): | ||
self.width = self.height = 500 | ||
self.rain_size = 2 | ||
self.rain_drop_list = [] | ||
self.rain_speed = 0.05 | ||
self.rain_density = 0.009 | ||
self.rain_angle = 0 | ||
self.background = 0 | ||
|
||
|
||
def drawHouse(self): | ||
glBegin(GL_QUADS) | ||
glColor3f(0.44, 0.22, 0.22) | ||
glVertex2f(300, 0) | ||
glVertex2f(150, 0) | ||
glVertex2f(150, 130) | ||
glVertex2f(300, 130) | ||
glEnd() | ||
glBegin(GL_TRIANGLES) | ||
glColor3f(0.47, 0.75, 0.46) | ||
glVertex2f(330, 130) | ||
glVertex2f(120, 130) | ||
glVertex2f(225, 250) | ||
glEnd() | ||
glBegin(GL_QUADS) | ||
glColor3f(0.48, 0.13, 0.6) | ||
glVertex2f(250, 35) | ||
glVertex2f(200, 35) | ||
glVertex2f(200, 84) | ||
glVertex2f(250, 84) | ||
glEnd() | ||
|
||
|
||
def rainMaker(self): | ||
delay = random.random() | ||
if delay < self.rain_density: | ||
x1 = random.randint(-800, self.width+800) | ||
y1 = self.height | ||
x2 = x1 | ||
y2 = self.height+random.randint(20, 70) | ||
self.rain_drop_list.append(Rain(x1, y1, x2, y2)) | ||
|
||
|
||
def drawRain(self): | ||
for rain in self.rain_drop_list: | ||
glPushMatrix() | ||
glTranslatef((rain.x1 + rain.x2)/2, (rain.y1 + rain.y2)/2, 0) | ||
glRotatef(self.rain_angle, 0, 0, 1) | ||
glTranslatef(-(rain.x1 + rain.x2)/2, -(rain.y1 + rain.y2)/2, 0) | ||
glLineWidth(self.rain_size) | ||
glBegin(GL_LINES) | ||
glColor3f(0.39, 0.4, 1) | ||
glVertex2f(rain.x1, rain.y1) | ||
glVertex2f(rain.x2, rain.y2) | ||
glEnd() | ||
glPopMatrix() | ||
|
||
|
||
def iterate(self): | ||
glViewport(0, 0, self.width, self.height) | ||
glMatrixMode(GL_PROJECTION) | ||
glLoadIdentity() | ||
glOrtho(0.0, self.width, 0.0, self.height, 0.0, 1.0) | ||
glMatrixMode(GL_MODELVIEW) | ||
glLoadIdentity() | ||
|
||
|
||
def showScreen(self): | ||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) | ||
glLoadIdentity() | ||
self.iterate() | ||
glClearColor(self.background, self.background, self.background, 1.0) | ||
self.rainMaker() | ||
self.drawRain() | ||
self.drawHouse() | ||
glutSwapBuffers() | ||
|
||
|
||
def animate(self): | ||
for idx, rain in enumerate(self.rain_drop_list): | ||
if rain.y1 >= 0 and rain.y1 <= self.height: | ||
if self.rain_angle < -5 and self.rain_angle >= -45: | ||
rain.x1 -= self.rain_speed | ||
rain.x2 -= self.rain_speed | ||
rain.y1 -= self.rain_speed | ||
rain.y2 -= self.rain_speed | ||
if self.rain_angle > 5 and self.rain_angle <= 45: | ||
rain.x1 += self.rain_speed | ||
rain.x2 += self.rain_speed | ||
rain.y1 -= self.rain_speed | ||
rain.y2 -= self.rain_speed | ||
if self.rain_angle > -5 and self.rain_angle < 5: | ||
rain.y1 -= self.rain_speed | ||
rain.y2 -= self.rain_speed | ||
else: | ||
self.rain_drop_list.pop(idx) | ||
glutPostRedisplay() | ||
|
||
|
||
def keyboardListener(self, key, x, y): | ||
if key == b"=": # + key | ||
self.rain_density += 0.001 | ||
if key == b"-": | ||
self.rain_density -= 0.001 | ||
if key == b"f": | ||
self.rain_speed += 0.01 | ||
if key == b"s": | ||
self.rain_speed -= 0.01 | ||
glutPostRedisplay() | ||
|
||
|
||
def mouseListener(self, button, state, x, y): | ||
pass | ||
|
||
|
||
def specialKeyListener(self, key, x, y): | ||
if key == GLUT_KEY_RIGHT: | ||
if not self.rain_angle >= 45: | ||
self.rain_angle += 1 | ||
if key == GLUT_KEY_LEFT: | ||
if not self.rain_angle <= -45: | ||
self.rain_angle -= 1 | ||
if key == GLUT_KEY_UP: | ||
if not self.background > 1: | ||
self.background += 0.05 | ||
if key == GLUT_KEY_DOWN: | ||
if not self.background < 0: | ||
self.background -= 0.05 | ||
glutPostRedisplay() | ||
|
||
|
||
def run(self): | ||
glutInit() | ||
glutInitDisplayMode(GLUT_RGBA) | ||
glutInitWindowSize(self.width, self.height) | ||
glutInitWindowPosition(0, 0) | ||
glutCreateWindow("OpenGL Rain Drop") | ||
glutDisplayFunc(self.showScreen) | ||
glutIdleFunc(self.animate) | ||
glutKeyboardFunc(self.keyboardListener) | ||
glutMouseFunc(self.mouseListener) | ||
glutSpecialFunc(self.specialKeyListener) | ||
glutMainLoop() | ||
|
||
|
||
if __name__ == "__main__": | ||
RainScene().run() | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,133 @@ | ||
#!/usr/bin/env python3 | ||
|
||
|
||
##################################################### | ||
######## CSE423_Lab01_Task02 #################### | ||
######## Abir Ahammed Bhuiyan ################## | ||
######## 20101197 ################ | ||
######## section: 01 ############## | ||
########################################## | ||
|
||
|
||
from OpenGL.GL import * | ||
from OpenGL.GLUT import * | ||
from OpenGL.GLU import * | ||
|
||
import random | ||
|
||
|
||
|
||
class Point: | ||
def __init__(self, x, y): | ||
self.size = 10 | ||
self.r = random.random() | ||
self.g = random.random() | ||
self.b = random.random() | ||
self.x = x | ||
self.y = y | ||
self.direction_x = int(random.sample([1, -1], 1)[0]) | ||
self.direction_y = int(random.sample([1, -1], 1)[0]) | ||
|
||
def __str__(self): | ||
return f"RGB -> ({self.r}, {self.g}, {self.b})" | ||
|
||
|
||
|
||
class PointScene: | ||
def __init__(self): | ||
self.width = self.height = 500 | ||
self.background = 0 | ||
self.speed = 0.001 | ||
self.point_number = 5 | ||
self.point_list = [] | ||
self.blink = False | ||
self.freeze = False | ||
|
||
|
||
def makePoints(self, x, y): | ||
for _ in range(self.point_number): | ||
self.point_list.append(Point(x, self.height-y)) | ||
|
||
|
||
def drawPoints(self): | ||
for point in self.point_list: | ||
glPointSize(point.size) | ||
glBegin(GL_POINTS) | ||
if self.blink and not self.freeze: | ||
if not random.randint(0, 50)%2: | ||
glColor3f(point.r, point.g, point.b) | ||
else: | ||
glColor3f(self.background, self.background, self.background) | ||
else: | ||
glColor3f(point.r, point.g, point.b) | ||
glVertex2f(point.x, point.y) | ||
glEnd() | ||
|
||
|
||
def iterate(self): | ||
glViewport(0, 0, self.width, self.height) | ||
glMatrixMode(GL_PROJECTION) | ||
glLoadIdentity() | ||
glOrtho(0.0, self.width, 0.0, self.height, 0.0, 1.0) | ||
glMatrixMode(GL_MODELVIEW) | ||
glLoadIdentity() | ||
|
||
|
||
def showScreen(self): | ||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) | ||
glLoadIdentity() | ||
self.iterate() | ||
glClearColor(self.background, self.background, self.background, 1.0) | ||
self.drawPoints() | ||
glutSwapBuffers() | ||
|
||
|
||
def animate(self): | ||
if not self.freeze: | ||
for point in self.point_list: | ||
point.x += point.direction_x * self.speed | ||
point.y += point.direction_y * self.speed | ||
glutPostRedisplay() | ||
|
||
|
||
def keyboardListener(self, key, x, y): | ||
if key == b' ': | ||
self.freeze = False if self.freeze else True | ||
glutPostRedisplay() | ||
|
||
|
||
def mouseListener(self, button, state, x, y): | ||
if not self.freeze: | ||
if button == GLUT_RIGHT_BUTTON and state == GLUT_DOWN: | ||
self.makePoints(x, y) | ||
if button == GLUT_LEFT_BUTTON and state == GLUT_DOWN: | ||
self.blink = False if self.blink else True | ||
glutPostRedisplay() | ||
|
||
|
||
def specialKeyListener(self, key, x, y): | ||
if not self.freeze: | ||
if key == GLUT_KEY_UP: | ||
self.speed += 0.001 | ||
if key == GLUT_KEY_DOWN: | ||
self.speed -= 0.001 | ||
glutPostRedisplay() | ||
|
||
|
||
def run(self): | ||
glutInit() | ||
glutInitDisplayMode(GLUT_RGBA) | ||
glutInitWindowSize(self.width, self.height) | ||
glutInitWindowPosition(0, 0) | ||
glutCreateWindow("OpenGL Point Spawn") | ||
glutDisplayFunc(self.showScreen) | ||
glutIdleFunc(self.animate) | ||
glutKeyboardFunc(self.keyboardListener) | ||
glutMouseFunc(self.mouseListener) | ||
glutSpecialFunc(self.specialKeyListener) | ||
glutMainLoop() | ||
|
||
|
||
if __name__ == "__main__": | ||
PointScene().run() | ||
|
Oops, something went wrong.