카테고리 없음

수학 과제용으로 파이썬 파일을 만들어서 돌려봤다.

hyuckkim 2020. 8. 11. 10:38

왜 만들었나?

수학선생님이 뭔가 만들어서 보고서 쓰면 세부특기사항에 올려준다고 공지하셔서...?

또 개인적으로도 한 번 해보고 싶었다.

얼마나 했나?

구상은 침대에서 1시간.. 코딩은 느긋하게 1시간에 중간중간 수정했고 돌리는게 4~5시간이었다.

그래서 뭔가?

다섯 개의 선과 다섯 개의 원을 그리고 x, y좌표 각각 -2 ~ 2 사이의 위치에 점을 찍은 뒤 도형 안에 있는지를 조사한다.

이걸 도형마다 백만 번 씩 반복하는 프로그램이다.

 

선과 원은 class인데, 선은 ax + by + c = 0 의 형태로 a와 b, c를 가진다.

원은 (x - a)² + (y - b)² = r 의 형태로 a와 b, r을 가진다. 근데 변수 이름을 x y 로 해놨더라.

점의 생성 범위는 int인 Khan 배열에서 사용하는데, x좌표 최소, x좌표 최대, y좌표 최소, y좌표 최대다.

선은 distance 함수를 가지고 있어 이걸 외부 값인 선의 굵기와 비교하고,

원은 반지름이 있어 외부 값을 사용할 수 없으니 distance 함수 대신 distance 함수를 사용한다

불편했던 부분은?

느리다! 최적화를 생각해 봐야지.

직관적이지 않다! 사진 파일을 만드는 방법을 생각해 봐야지.

의미가 있었는가?

당연하죠

세특을 코딩으로 채운다!

 

참고로 코드는 이렇다. 참고할 수 있으면 참고해 봐라.

import random
import math

class Line(object):
	def __init__(self,a,b,c):
		self.a = a
		self.b = b
		self.c = c

	def distance(self,x,y):
		print("(" + str(x) + ", " + str(y) + "), " +str(self.a) + "x + " + str(self.b) + "y + " + str(self.c))
		print("distance : " + str(abs(x * self.a + y * self.b + self.c) / math.sqrt(self.a * self.a + self.b * self.b)))
		return abs(x * self.a + y * self.b + self.c) / math.sqrt(self.a * self.a + self.b * self.b)
	def lang(self):
		return str(self.a) + "x + " + str(self.b) + "y + " + str(self.c)
class Circle(object):
	def __init__(self,x,y,r):
		self.x = x
		self.y = y
		self.r = r
	def distanceis(self,x,y):
		print("(" + str(x) + ", " + str(y) + "), " +"(x - " + str(self.x) + ")² + ( y - " + str(self.y) + ")² = " + str(self.r * self.r))
		print("distance : " + str(math.sqrt(abs(x-self.x) * abs(x-self.x) + abs(y-self.y) * abs(y-self.y))))
		return math.sqrt(abs(x-self.x) * abs(x-self.x) + abs(y-self.y) * abs(y-self.y)) < self.r		
	def lang(self):
		return "(x - " + str(self.x) + ")² + ( y - " + str(self.y) + ")² = " + str(self.r * self.r)

Khan = [-2,2,-2,2] #x / x / y / y 
k = [[Line(1,-1,0),1,0],[Line(1,1,0),1,0],[Line(2,-1,0),1,0],[Line(1,-2,0),1,0],[Line(1,-1,2),1,0]]
c = [[Circle(0,0,1),0],[Circle(0,0,2),0],[Circle(0,2,1),0],[Circle(0,2,2),0],[Circle(1,1,1),0]]
for kk in k:
	for x in range(1000000):
		if(kk[0].distance(random.uniform(Khan[0],Khan[1]), random.uniform(Khan[2],Khan[3])) < kk[1]):
			print("Enter.")
			kk[2] += 1
		print(str(x) + " times")
for cc in c:
	for x in range(1000000):
		if(cc[0].distanceis(random.uniform(Khan[0],Khan[1]), random.uniform(Khan[2],Khan[3]))):
			print("Enter.")
			cc[1] += 1
		print(str(x) + " times")
i = 0
for kk in k:
	i += 1
	print("Line " + str(i) + " : " + kk[0].lang() + " , "+str(kk[2]))
for cc in c:
	i += 1
	print("Circle " + str(i) + " : " + cc[0].lang() +" , " +str(cc[1]))
x = input()