저항력, 중력 벡터 GUI구현

이미지
Drag force and Gravity 이번에는 Python, PyQt5를 이용해 구현한 저항력(Drag force), 중력(Gravity) 예제를 소개하려 합니다. 자세한 소스코드는 맨 뒤에 살펴보고, 일단 수식 유도과정과 결과만 살펴보겠습니다. 앞 게시물인 벡터(1편) , 힘과 가속도(2편) 에 이어지는 내용입니다. 1. 유체 저항 어떤 물체가 공기나 물속에서 받는 저항을 어떻게 프로그래밍으로 구현할 수 있을까요? 아래는 유체 저항(벡터, 힘)을 구하는 수식입니다. 각각, F 는 저항력, C는 저항 계수, A는 유체와 닿는 앞면적, p는 액체밀도, V는 속도의 방향을 뜻하는 단위벡터입니다. 저항력 F 벡터를 구해 속도의 방향과 반대로 적용 해 주면 힘이 감소 됩니다. [유체저항 공식] 앞 게시물에서 가속도는 속도 에 영향을 미치고, 속도는 위치 에 영향을 미친다는 사실을 살펴보았습니다. 또한 가속도, 속도, 위치는 벡터라는 것도 살펴보았습니다. 실제 우리가 사는 세계나 정확한 계산이 필요한 시뮬레이션 소프트웨어라면 위의 수식에 들어가는 계수(Coefficient)들을 정확하게 측정해서 적용 해야 하겠지만 우리가 만드는 코드는 꼭 정확해야 할 필요는 없습니다. 왜냐하면, 프로그래머인 내가 창조하는 소프트웨어 속 세상에서 유체저항을 내가 원하는 대로 만든다고 해도 누가 뭐라 할 사람은 없습니다. 이해를 돕기 위해 위의 유체저항 공식을 재 구성해 보겠습니다. 위 수식에서 저항계수(C), 물체 앞면적(A), 액체 밀도(p)는 프로그래머가 편리하게 상수를 정해 쓰면 됩니다. 예) 저항계수(C) : 0.1, 물체 앞면적(A) : 무시, 액체 밀도(p) : 1 ... 이렇게 생각하면 위 유체저항 수식은 아래와 같이 간략히 만들어 볼 수 있습니다. 저항력(힘, 벡터) =  속도(벡터) * ...

힘과 가속도 벡터 GUI 구현

이미지
Force and Acceleration 이전 벡터 마우스 트래킹예제 는 나름 훌륭하지만 조금 아쉬운 부분이 있습니다. 바로 이동 물체에 대한 질량 개념 이 없어 가속도 구현이 마치 자석에 이끌리듯 마우스를 쫓아 가는 모습이었습니다. 이제 뉴턴의 제2 운동법칙 F=MA 을 적용해볼 시점이 된 것 같습니다. F(Force)는 힘 이고, M(Mass)은 질량 , A(Acceleration)는 가속도 입니다. 따라서 힘은 질량과 가속도를 곱한 값 입니다. 이 수식을 살짝 바꾸면 아래와 같습니다. A = F / M (가속도는 힘을 질량으로 나눈 값이다) 즉, 있는 힘을 다해 밀더라도 물체가 무겁다면 가속도는 느려지겠지요. 살짝 밀더라도 물체가 가볍다면 빠르게 가속할 것입니다. 조금 더 이해를 쉽게 하기 위해 M(질량)이 1이라고 가정한다면 A = F 라는 결과를 얻고, 바로 가속도는 힘과 같습니다. 이 원리를 이용해 중력을 흉내내는 코드를 만들어 보았습니다. [예제 실행화면] 먼저, 물체의 위치, 속도, 가속도 벡터를 묶어서 클래스로 만듭니다. 1. mover.py 파일 코드 from Physics.vector import vector from PyQt5.QtGui import QColor from random import randint class Mover: def __init__(self, x=0.0, y=0.0, mass = 1.0): self.location = vector(x,y) self.velocity = vector() self.acceleration = vector() # 질량 self.mass = mass self.G = 1.0 self.color =...

벡터, 크기와 방향을 갖는 물리량의 시각화

이미지
Vector and Mouse Tracking 벡터(vector) 는 무엇일까요? C++언어를 공부한 사람이라면 벡터 (std::vector)는 가변형 배열로 생각할 수도 있습니다. 오늘 예제를 통해 공부할 벡터는 고등 수학에서 배우는 유클리드 벡터 를 의미합니다. 바로 크기와 방향을 모두 갖는 물리량 입니다. 무게(1kg) , 거리 (1m) 등 크기만을 가지는 양을 스칼라 라고 하고, 벡터는 여기에 방향이 같이 더해진 개념입니다. 예) 집에서 40도(북동쪽) 방향으로 5km 떨어진 곳에 호수가 있다. [벡터의 예] 프로그래밍을 공부하는데 뜬금없이 왜 벡터를 이야기하나 생각하실 수도 있지만, 우리가 즐겨하는 게임의 세계는 대부분 벡터라는 개념을 이용해 컴퓨터 세계에 창조되어 있습니다. 위치, 이동, 회전, 중력, 속도, 가속도  등의 요소가 들어간 게임이라면 틀림없이 벡터를 사용합니다. 아직 무슨 말인지 잘 이해가 안되리라 생각합니다. 먼저 오늘 만들 주제의 결과물을 한번 보시죠. 위 예제는 Python, PyQt5 을 이용해 만들었으며 벡터를 이용해 마우스를 따라오도록 만든 예제 입니다. 제가 좋아하는 책인 'Nature of Code' (저자:다니엘 쉬프만) 을 참조해 만들어 보았습니다. 해당 책에서 저자는 ' 프로세싱 언어 '를 이용해 코드를 구현하고 있습니다. 프로세싱 언어는 C++ 언어와 문법이 유사하며, 간단한 명령을 통해 시각적인 효과를 바로 확인해 볼 수 있는 프로그래밍 언어입니다. 프로세싱 언어를 모른다고 걱정할 필요는 없습니다. C...

자동판매기 클래스로 구현하기

이미지
이전 게시물 중 절차지향적으로 만든 파이썬 자판기 예제가 있습니다. 이번에는 클래스 를 이용해 자판기를 만들어 볼 생각입니다. 꼭 자판기를 클래스를 이용해 만들 필요는 없지만, 우리의 목적은 늘 그렇듯이 프로그래밍 스킬 향상이므로 이번에는 클래스를 이용해 객체지향적으로 자판기 를 만들어 보고자 합니다. 어제 2개월 진도반 수업시 함께 만들어본 자동판매기 클래스 버전입니다. 판매목록을 보여주고, 투입금액을 입력받은 후 물품을 선택해 구입하는 방식입니다. [자동판매기 실행화면] 먼저 코드를 한번 살펴보겠습니다. class Zapangi: def __init__(self): self.p = {'콜라':500, '사이다':400, '환타':600} self.n = {1:'콜라', 2:'사이다', 3:'환타'} self.money = 0 def showmenu(self): print('[메뉴정보]') i = 1 for k, v in self.p.items(): print(str(i)+'.', k, v, '원') i+=1 print() def inputmoney(self): while True: try: self.money += int( input('돈 투입:') ) except Exception as e: print(e) continue ...

파이썬으로 구현한 채팅 클라이언트앱

이미지
이전 채팅 서버에 이어 이번에는 채팅 클라이언트(Chat Client) 입니다. 서버측 프로그래밍 은 이전 게시물을 참조하기 바랍니다. [채팅 클라이언트 화면] Python + PyQt5를 이용해 만들어 보았습니다. 채팅 클라이언트는 client.py, window.py 두개의 파일로 구성되어 있습니다. 1. client.py 파일 분석 이 파일은 클라이언트 소켓 관련된 클래스이며, 서버 연결, 데이터 송수신과 관련된 처리를 담당합니다. 전체 소스코드를 살펴보겠습니다. from threading import * from socket import * from PyQt5.QtCore import Qt, pyqtSignal, QObject class Signal(QObject): recv_signal = pyqtSignal(str) disconn_signal = pyqtSignal() class ClientSocket: def __init__(self, parent): self.parent = parent self.recv = Signal() self.recv.recv_signal.connect(self.parent.updateMsg) self.disconn = Signal() self.disconn.disconn_signal.connect(self.parent.updateDisconnect) self.bConnect = False def __del__(self): self.stop() def connectServer(self, ip, port): ...

파이썬으로 구현한 채팅 서버앱

이미지
이번에 만든 주제는 파이썬 다자간 채팅 프로그램(Chat Server) 입니다. 구글 검색을 통해 찾아봐도 파이썬 소켓 모듈을 이용한 간단한 예제(에코 서버)는 있지만, 쓸만한(?) 코드는 찾기 힘들어 Python + PyQt5를 이용해 직접 만들어 보았습니다. 먼저 채팅 프로그램은 채팅 Server(접속 대기) 와 채팅 Client(접속 하는 자) 로 나누어 제작하고, 이번 포스팅에서는 서버 에 대한 내용을 다룹니다. 대학시절, 네트워크 프로그래밍에 관심이 많아 C++을 이용해 여러가지 (네트워크 빙고게임, 채팅, 동영상 전송 등)를 제작하며 소켓 프로그래밍에 입문하였고, 벌써 20년이라는 세월이 지났네요. 파이썬으로 소켓을 다루어 본 것은 이번이 처음입니다만 역시 파이썬... 쉽습니다. 20년이란 세월이 흘렀지만, 소켓은 크게 변한게 없습니다. 소켓은 버클리 대학에서 만들어 버클리 소켓이라고도 합니다. Socket은 복잡한 컴퓨터 네트워크 구조 (OSI 7 Layer)를 모르더라도 (즉, 우편을 보낼때, 받는주소와 내용을 적어 우체통에만 넣으면 전달되는 것처럼) 프로그래머가 소켓이라는 소프트웨어 도구를 이용해 보내고자 하는 내용을 받는 IP주소로 편리하게 전달해 주는 역할을 합니다. 우리는 우편 시스템 (보내는 사람->우체통->우체국->이동->도착지 우체국->전달완료) 을 몰라도 받는 사람의 주소만 알면 편리하게 내용을 전달하는 원리와 같습니다. 이제 본격적으로 채팅 서버를 살펴 보겠습니다. 먼저 채팅서버를 실행한 화면입니다. [채팅 서버 화면] 채팅서버의 주요 기능은 아래와 같습니다. 1. 서버 IP 주소, Port 설정 2. 접속자 정보 창 3. 받은 메시지 보기, 메시지 전송 기능 4. 다자간 채팅 기능 (여러명 접속 가능) 아래는 다음 포스팅에 살펴볼 클라이언...

이 블로그의 인기 게시물

Qt Designer 설치하기

PyQt5 기반 동영상 플레이어앱 만들기