2D 게임의 기본 벡터 이동, 회전 변환 행렬이해하기

이미지
개요 이번에는 Python + PyQt5를 이용해 마우스를 따라 다니며 회전 하는 물체 를 구현해 보았습니다. 벡터, 회전행렬 연산 을 이용해 구현되어 있으며, 자세한 수식유도과정은 소스코드 설명부에서 진행하고 결과만 먼저 살펴보겠습니다. 전반적인 동작방식은 아래와 같습니다. 1. 마우스 포인터 위치와 사각형의 위치 비교 후 (벡터 차연산) 가속도벡터 를 만들고 이를 속도벡터 에 더해 속도 구하기. (가속도는 속도에 영향) 2. 속도는 사각형의 위치에 영향을 미치므로 속도벡터와 사각형위치벡터를 합연산 . 3. 사각형은 가속하며 마우스위치로 이동. 4. 사각형 이동시 속도 벡터의 각도 를 구해 사각형 4개 꼭지점을 원점을 중심으로 회전. (회전변환 행렬) 5. 회전된 사각형의 4개 꼭지점을 이어서 선을 그리면 사각형 이동시 방향이 전환됨.

처음 시작하는 딥러닝, Keras 활용

이미지
들어가며 이 글이 처음 딥러닝(Deep Learning) 을 공부하는 분들에게 도움이 되었으면 합니다. 저도 딥러닝을 공부하며 자주 찾는 아래 사이트의 게시물을 사견 + 번역해 옮긴 내용입니다. 딥러닝을 처음 공부하면, 대부분 TensorFlow 를 찾아 자료를 검색하고 공부해 가는데, 경험상 처음은 Keras 를 이용해 간단한 예제부터 시작해 개념을 파악한 후 깊게 진행하는 방식이 저는 쉬웠습니다. [자료 출처] Your First Deep Learning Project in Python with Keras (링크) , Jason Brownlee, PhD 

파이썬을 활용한 PID 제어기 GUI 구현

이미지
들어가며 이번 시간에는 PID 제어기를 Python, PyQt5, Matplotlib 를 이용해 만들어 보았습니다. 결과물을 먼저 살펴보면 아래와 같습니다. [완성 결과물]

C++에서 여러값을 리턴해야 하는 경우

이미지
들어가며 코드를 작성하다 보면 함수에서 여러 값을 리턴해야 하는 경우 를 종종 만나게 됩니다. 예를 들면 두수를 전달받아 덧셈, 뺄셈, 곱셈, 나숫셈을 리턴 (4가지 값) 해주고 싶은 경우도 해당되겠지요. C++ 11이 등장하기 전 여러 값을 함수에서 리턴하는 경우, 구조체 or 클래스 선언하고 값을 리턴 해야 했습니다. 물론 동일한 타입의 여러값들을 리턴한다면 std::vector로 가능하지만 늘 타입들이 같은건 아닙니다.

Qt WebEngine을 활용한 웹페이지 PDF 변환

이미지
들어가며 바로 이전 게시물의 주제가 파이썬을 이용해 " 웹페이지 PDF변환, 인쇄 " 예제 입니다. 이번 예제는 같은 주제를 C++ 로 구현해 보았습니다. 실행시 웹브라우저(X)가 아니라 만든 앱을 이용해 아래와 같이 웹페이지를 표시하고, 이를 PDF 저장 or 인쇄 가 가능합니다. [네이버 페이지 표시] [PDF로 저장된 모습] [웹페이지 인쇄 화면]

PyQt WebEngine을 활용한 웹페이지 PDF 변환

이미지
들어가며 이번 주제는 파이썬과 Qt의 QtWebEngine 을 이용해 웹페이지를 앱 에 띄우고 해당페이지를 PDF 파일 저장, 인쇄 하는 프로그램을 만드는 것입니다. 예전에 작성한 게시물 중 PDF 변환 예제 가 있는데, 이미지로 캡쳐 해 변환하는 방식이라 확대시 글자가 흐릿해지는 현상을 방지하는 보완 예제로 만들어 보았습니다. 결과물을 먼저 살펴보면 아래와 같습니다. (웹 브라우저가 아니라 Python 앱에 QWebEngineView 클래스 배치 후 웹페이지를 띄운 모습) [앱 실행화면] 앱을 실행 후 PDF, PRINT 버튼을 누르면 파일저장, 인쇄창이 뜨는데 캡쳐된 동영상에서는 보이지 않네요. 아래 링크를 통해 직접 한번 사용해 보기 바랍니다.  (파이썬 가상환경으로 개발하지 않아 실행파일 크기가 큽니다. 약 100 MB) Pyinstaller 제작 실행파일(*.exe) 링크 :  WebViewer

PyQt 무작위 도형 그리기

이미지
들어가며 오늘은 파이썬의 랜덤과 쓰레드를 이용한 랜덤 그리기 예제입니다. 실행하면 아래와 같이 0.1초 주기로 원, 사각형을 무작위의 위치와 색 으로 그려주는 방식으로 만들어 보았습니다. [랜덤 그리기 실행모습] 소스코드 from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtGui import QPainter, QColor, QBrush from PyQt5.QtCore import Qt, QRect from threading import Thread import time import random import sys QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True) class Shape: def __init__(self, type=0, r=0, g=0, b=0, a=0,rect=QRect()): self.type = type self.color = QColor(r, g, b, a) self.rect = rect class Form(QWidget): def __init__(self): super().__init__() self.setWindowTitle('OCS Drawing') self.resize(600,600) self.shapes = [] #Create thread self.bRun = True self.t = Thread(target = self.threadFunc) self.t.start() def paintEvent(self, e): qp = QPainter(

std::vector, Iterator 직접 구현하며 이해하기

이미지
들어가며  C++ 표준 라이브러리 (STL) std::vector 는 순차적인 자료(배열)를 저장하는 템플릿 클래스입니다.  처음 프로그래밍을 배우던 시절 수년간 동적 메모리 할당(Dynamic Allocation) 을 오직 new, delete 구문에만 의존해 왔습니다. (STL이 뭔지 몰랐습니다.) 그러던 어느날 std::vector 를 처음 사용해 본 후 그 편리함과 왜 이런 존재를 나는 몰랐지라는 허무함이 공존했던 기억이 납니다. 하지만 new, delete를 다년간 사용하며 배웠던 포인터, 메모리에 대한 깊은 이해 는 현재까지도 프로그래밍 지식의 좋은 밑바탕이 되었음을 스스로 느낍니다. 편리함의 이면 std::vector를 접한 후 대부분의 동적 배열, 동적메모리 할당 은 제 코드에서 사라지게 되었고, 남이 만든 클래스(물론 표준이지만)의 사용법을 배우는 것에만 집착하게 됩니다. "이게 어떻게 만들어져 있지" 보다 "어떻게 이것을 사용하지" 라는 생각만 남아 깊은 공부에 별 도움이 되지 않는 도구의 사용법에만 관심이 있었습니다.  대학시절의 자신에게 돌아간다면, 그건 (사용법은) 별로 중요하지 않다고 말해주고 싶군요. 오히려 " 비슷하게 직접 한번 만들어 보는 것은 어때 " 라고 권해주고 싶습니다. 또한, STL은 C++의 강력한 표준 라이브러리이지만 언제나 사용가능한 것은 아닙니다. (아두이노 IDE는 C++언어를 지원하지만 STL은 사용이 불가, 작은 메모리환경)   std::vector 그럼 직접 나만의 벡터 를 만들어 보겠습니다. 앞으로 소개할 예제는 vector Class, Nested Class로 iterator Class 구현까지 포함한 내용입니다. 물론 표준 라이브러리만큼 훌륭하진 않지만 좋은 공부가 될 것입니다.

PyQt를 이용해 날아오는 적군 피하기 게임

이미지
개요 이번 주제는 Python과 PyQt5를 이용한 피하기 게임 입니다. 기본 구성은 주인공이 키보드 화살표(상, 하, 좌, 우)로 이동하고, 모든 방향에서 출현하는 적을 피하는 게임입니다. 지뢰라는 아군의 무기를 도입해 스페이스 키를 누르면 동그란 원이 생기고 적으로부터 1회의 방어막을 생성합니다. (쿨타임 3초) 가끔씩 등작하는 "갈색 적군" 은 아군과 접촉하면 모든 적이 한번에 사라집니다.   [실행 화면] PyGame 을 활용해 더 비주얼하고 멋진 게임 코드를 작성할 수도 있지만, 여러분이 개발 가능한 영역을 더 확장(유틸리티, 시스템소프트웨어, 네트워크 등)하기 좋은 Qt를 배우는 것을 권장하고 싶습니다. 예제를 작성시 아래 사항들에 대해 주의를 기울여 코드를 작성해 보았습니다. 객체 지향적 으로 만들자 화면 갱신을 최소화해 CPU 점유율 을 낮추자   소스코드 그럼 소스코드를 한번 살펴보겠습니다. 게임은 총 3개의 파이썬 파일 ( main.py, game.py, unit.py ) 로 구성되어 있습니다.   unit.py 파일 이 파일은 Unit, Enemy, My 3개의 Class 선언 입니다. from PyQt5.QtCore import Qt, QRectF from PyQt5.QtGui import QColor class Unit: def __init__(self, r=QRectF(), c=QColor()): self.rect = r self.color = c class Enemy(Unit): def __init__(self, dir=0, type=0, r=QRectF(), c=QColor()): super().__init__(r, c) #

자동차 트립컴퓨터 파이썬클래스로 구현하기

이미지
오늘은 파이썬으로 자동차 클래스 를 만들어 보고자 합니다. 예를 들면, 자동차의 연비, 최대 연료 탱크량, 현재 연료량, 주행거리 등을 속성 (Attribute or Property)으로 갖고 "기름을 넣다", "주행하다" 등의 행위를 함수 (Method) 로 구현하고자 합니다. 클래스를 설계할 때, 위와 같이 속성은 변수 로, 행위는 함수 로 구현하는 것이 기본입니다. 아래와 같이 사용합니다. 두개의 파이썬 파일 ( main.py, car.py ) 로 구성되어 있으므로 두 파일을 같은 경로에 두고 main.py를 실행하면 됩니다.  먼저 Car Class 객체를 생성하고 사용하는 main.py 파일입니다. main.py from car import Car c = Car('마이카', 15, 60) # 이름, 연비, 연료탱크량 c.print() c.chargeFuel(47) c.print() c.drive(100) c.print() 코드는 아래와 같이 동작합니다. 3번 라인 : Car 클래스 객체 c 생성, (차량이름, 연비, 최대연료탱크량) 4번 라인 : Car 클래스 print() 메서드 호출, 차량 정보 출력 6번 라인 : Car 클래스 chargeFuel() 메서드 호출, 기름 충전 9번 라인 : Car 클래스 drive() 메서드 호출, 차량 주행   위 코드의 수행 결과는 다음과 같습니다. 마이카를 한대 생성하고, 기름을 47 리터 충전 후, 100 Km를 주행한 결과입니다. [Car 클래스 생성 후 사용결과] car.py 다음으로 Car Class 코드를 살펴보겠습니다. class Car: def __init__(s

이 블로그의 인기 게시물

Qt Designer 설치하기

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