-
안드로이드에서의 가장 간단하고 확실한 칼만필터(Kalman Filter) 테스트
얼마 전 아는 지인을 통해 칼만필터(Kalman Filter)라는것을 알게 되었다. 오래전 기울기센서를 이용한 "운전좀하냐" 라는 게임을 만들때에 자동차가 엄청 흔들리고 불안정해서 온갖방법과 테스트를 해보았지만 결국 만족스러운 결과를 못내고 출시해야 했다ㅠㅠ 그런데 우연히 지인을 통해 알게된 칼만필터를 써보니!! 한방에 해결이 되는게 아닌가ㅎㅎ 물론 좀더 손을 봐야 할것 같지만 어쨋든 예전소스랑 칼만필터를 결합하니 제법 만족스런 결과를 얻어냈다 그래서 여기에 직접 칼만필터의 위력을 보여주고자 한다... 우선 칼만필터란 잡음같은것을 없에는 기법이다. 기울기센서에서는 민감한 센서에 의해 아주작은 손떨림에도 반응하여 값이 흔들리는 현상을 보정해 준다 기본원리는 간단하다. 기울기센서 값을 계속 저장해 두었다가 ..
2014.03.17
-
삼각 분포로 난수 발생시키기
가우시안 분포 즉, 정규분포로 난수를 발생시켜야 하는 경우가 종종 있다. 하지만 우리가 흔히 사용하는 rand() 함수는 균일 분포로 난수를 가져오므로 따로 구현해야 한다. 다행히 정규분포 난수 발생 소스는 인터넷상에서 쉽게 구할수 있기 때문에 별 문제 될 건 없다. 한 가지 딴지를 걸자면 정규분포는 피 적분이 안되기 때문에 반복문을 사용해 난수를 만들어야 한다. 만약, 아주 많은 난수를 한꺼번에 발생시킨다면, 부하가 걸릴 수 있다는 말이다. 물론, 아주 쓸데없는 걱정이다. 그정도로 21세기의 컴퓨터는 나약하지 않다ㅎㅎ 어쨌거나 반복문이 없는 확률 밀도 기반 난수를 쓰고 싶다는 어리석은 생각에 다음과 같은 삼각 분포 난수 함수를 만들어 보았다. 삼각형 그래프는 정적분이 쉬워서 면적을 비율 삼아 난수를 발..
2019.10.28
-
사각형 말고 원형 충돌검사
게임상에서 가장 기본적인 충돌검사는 사각, 원, 선 검사라고 생각한다 왜냐하면 이 세가지의 개념을 조합하면 좀더 정밀한 다각형, 픽셀 검사를 할수 있기 때문이다 여기서는 단순하게 원형끼리의 검사를 살펴보겠다 원은 한점에서 일정거리 만큼의 영역을 가지는 도형이다 그래서 두 원의 영역이 겹치는 조건은 중심점끼리의 거리로 판단한다. 위와 같이 중심점 사이의 거리가 두 반지름의 합보다 크면 서로 떨어져 있는 것이다. 두점 사이의 거리는 중3때 배우는 공식을 사용하면 된다 (http://mathbang.net/138) 반대의 경우로 중심점 거리가 반지름의 합보다 작아지면 겹치게 된다. 즉, 이때가 충돌한 것이다. 충돌이긴 한데.. 완전히 겹치는, 다시 말해 한 원에 완전히 포함되는 경우는 반지름의 차로 계산한다...
2016.01.25
-
초간단 꺽은선 그래프 만들기
그래프는 텍스트로 표현하기 복잡한 정보를 한결 보기좋게 만드는 매력이 있다. 그래서 간편함의 상징인 모바일에서는 빠질수 없는 요소이다. 특히 많이 쓰이는 것이 막대 그래프와 꺽은선 그래프 일것이다. 그런데 꺽은선 그래프는 선이 하나로 이어져 있기 때문에 만드는데 애를 먹을때가 있다 그때를 대비해 초간단 꺽은선 그래프뷰를 만들어 놓자~ 구미에 맞게 확장해서 쓰면 매우 유용하다 public class GraphView extends View { private ShapeDrawable mLineShape; private Paint mPointPaint; private float mThickness; private int[] mPoints, mPointX, mPointY; private int mPointSiz..
2016.04.25
-
EditText에 자동으로 단위 콤마 넣기
NumberFormat 을 이용하면 숫자에 단위 콤마를 쉽게 찍을수 있다. 하지만 이를 EditText에 적용할려고 하면 한가지 문제가 생긴다. 입력할때마다 콤마가 찍혀야 하는데... addTextChangedListener에서 NumberFormat으로 콤마를 찍으면 당연히 텍스트가 변경되므로 다시 리스너가 호출된다. 즉, 호출이 무한 반복되면서 앱이 멈추게 된다. 그래서 살짝 꼼수를 부려봤다. EditText 밑에 같은 크기의 TextView를 깔고 여기에 콤마를 찍은 텍스트를 대신 써주고, 후에 EditText를 동기화 하는 것이다. 물론, EditText는 투명하게 설정해 안보이게 한다. 사실 임시 방편으로 만든것인데.. 생각보다 잘 작동해 계속 쓰고 있다 ㅎㅎㅎ 소스는 다음과 같다. 요즘 뜨고 ..
2019.01.17
인기글
-
View를 서서히 나오고 사라지게 하는 간단 방법
Activity를 전환할때 서서히 나오고 사라지는 등의 애니메이션을 넣을 수 있다 당연히 Activity가 아닌 일반 View 도 가능하다 하지만 View 에서는 한가지 주의할 점이 있다. Activity는 전환 애니메이션을 마치면 자동으로 생성되거나 없어지지만 View는 그렇지 않다는 것이다. 즉, 애니메이션이 시작 또는 끝날때 View를 부모뷰에서 빼고 넣거나 보이게 또는 보이지 않게 처리 해주어야 한다. 애니메이션을 불러와 시작하는 코드 //나오기 fun startAnimationWithShow(context: Context, view: View, id: Int) { view.visibility = View.VISIBLE //애니메이션 전에 뷰를 보이게 한다 view.startAnimation(An..
2022.03.13
-
손쉽게 아이폰 앱을 새로 실행 시키는 코드 한줄
안드로이드에서는 메인 activity를 종료하고 다시 호출하면 바로 재시작이 된다. 하지만 아이폰에서는 그렇게 할수가 없었다. 혹시나 하는 마음에 재시작 시키는 함수를 찾아봤지만 이 또한 없었다. 나의 구글링 실력이 부족해서 못찾은거일수도 있지만... 좌절하고 있는 순간... 정말 우연하게 방법을 알아냈다. 사실 실수로 코드를 잘못 넣었는데... 재시작이 되는것이다... 아! 실수로 찍은 로또나 될것이지.. 어쨋든 기분은 좋다. 불로소득같은 느낌이다. 방법은 진짜 간단하다. AppDelegate 의 applicationWillEnterForeground 에서 exit(0)를 호출해주면 된다. 아마도 잠에서 깨어나기 직전에 종료를 해주면 깨어나는 작업이 중단되지 않고 계속 진행되면서 재시작되는 효과가 나오..
2018.03.26
-
간단한 코딩으로 큰따음표("")로 묶인 CSV 파일 보기
CSV란 콤마(,)로 구분한 일련의 데이터들을 말한다. 예를 들면 아래와 같다. 고양이,강아지,곰,상어,토끼 100,20,55,177,83 이런 형식은 서로 호환 되지 않는 프로그램끼리 데이터들을 주고 받을때 유용하게 쓰인다. 또한 매우 간단하기 때문에 부담도 없다. 하지만 흔한 문제점 하나가 있다. 콤마가 있는 데이터가 있을 경우다. 56 10,000 1,500 300 890 2,360,050 74 금액을 표시할때 위와 같이 종종 단위 콤마를 쓰는데 이것을 CSV로 표현하면, 56,10,000,1,500,300,890,2,360,050,74 가 된다. 의도와는 다르게 데이터가 56 10 100 1 500 300 890 2 360 050 74 로 나누어져 버렸다 그래서 콤마가 있는 데이터를 큰따음표(""..
2016.11.14
-
SwiftUI TextField 에서 placeholder color 변경하기
안녕하세요 오랜만에 글을 올립니다~ 그동안 나이만 먹고 살림살이는 나아지지 않아 슬프지만.. 오늘도 저처럼 힘겨운 날을 보내고 계실 개발자분들을 위해 조금이라도 힘내시라고 작은 지식 하나 공유해 봅니다 이번 포스팅은 SwiftUI TextField 에서 겪은 삽질? 에서 비롯되었는데요.. 문자를 입력하기 전 디폴트로 뜨는 희미한 도움말인 placeholder 의 글자색이 변경이 안되는 겁니다!! UIKit에선 오래전부터 알려진 방식으로 손쉽게 할수 있었는데, SwitfUI 이넘은 아직 생긴지 얼마 안되서 그런지 구글신의 힘도 미약하고, 잘 안되서... SwiftUI의 특성을 최대한 이용해 아래와 같이 만들어 봤습니다. textfield costom 뷰... import SwiftUI struct Plac..
2022.07.29
-
UIEdgeInsets 없이 UILabel에 여백 넣기
UILabel에 여백을 넣는 방법은 다양하다. 그 중 NSLayoutConstraint를 이용하는 법을 다뤄보자! class FitLabel: UILabel { //상하좌우 여백 storyboard 입력값 @IBInspectable var edge: CGSize = CGSize(width: 0, height: 0) //너비, 높이가 적용될 Constraint private var mWidthConstraint, mHeightConstraint: NSLayoutConstraint? //좌우 여백값 var edgeAllWidth: CGFloat { return edge.width * 2 } //상하 여백값 var edgeAllHeight: CGFloat { return edge.height * 2 } ove..
2018.05.08
-
TimePicker, DatePicker, NumberPicker의 폰트 바꾸기
시간을 쉽게 선택할 수 있는 TimePicker, 날짜를 쉽게 선택할 수 있는 DatePicker 이것들은 NumberPicker로 이루어진 UI이다. 그래서 이 Picker들의 폰트를 바꾸기 위해서는 NumberPicker의 구조를 알아야 한다. NumberPicker는 현재 선택된 숫자를 보여주는 TextView와 그 주위의 숫자를 스크롤하며 보여주는 휠 뷰로 구성된다. (스타일을 Theme.Holo.Light 로 적용했을 경우) 즉, 폰트를 바꿔줄때 이 두가지를 모두 바꿔줘야 한다는 의미다. public void setTypeface(NumberPicker picker, Typeface typeface) { //주위의 숫자들을 보여주는 휠 뷰 try { //클래스의 휠 Paint 객체를 꺼내 폰트를..
2016.07.18
-
게임에 꼭 필요한 난수, 간단하게 확률대로 발생시키기
게임을 만들때 수없이 사용되는 난수.. 이런 난수는 보통 오브젝트의 위치나 종류를 결정할때 사용된다. 예를 들어서 장애물이 임의의 위치에 나타나거나 보상아이템이 랜덤하게 나오는 경우이다. 하지만 이때에는 무작정 랜덤하게 나오는 것보다 장애물이 특정 위치에 더 자주 나온다던지, 보상아이템중 더 좋은 아이템은 적은 확률로 나온다던지 하고 싶을 경우가 있을것이다. 그래서 여기서는 난수를 확률대로 나오게 하는 간단한 나만의 방법을 소개하고자 한다. public class Rate { public int mTable[]; //확률 설정 public void set(int rate[]) { int table[] = new int[100]; //각각의 숫자들의 확률을 담을 테이블배열 int value = 0; //테..
2014.09.14
-
안드로이드에서의 가장 간단하고 확실한 칼만필터(Kalman Filter) 테스트
얼마 전 아는 지인을 통해 칼만필터(Kalman Filter)라는것을 알게 되었다. 오래전 기울기센서를 이용한 "운전좀하냐" 라는 게임을 만들때에 자동차가 엄청 흔들리고 불안정해서 온갖방법과 테스트를 해보았지만 결국 만족스러운 결과를 못내고 출시해야 했다ㅠㅠ 그런데 우연히 지인을 통해 알게된 칼만필터를 써보니!! 한방에 해결이 되는게 아닌가ㅎㅎ 물론 좀더 손을 봐야 할것 같지만 어쨋든 예전소스랑 칼만필터를 결합하니 제법 만족스런 결과를 얻어냈다 그래서 여기에 직접 칼만필터의 위력을 보여주고자 한다... 우선 칼만필터란 잡음같은것을 없에는 기법이다. 기울기센서에서는 민감한 센서에 의해 아주작은 손떨림에도 반응하여 값이 흔들리는 현상을 보정해 준다 기본원리는 간단하다. 기울기센서 값을 계속 저장해 두었다가 ..
2014.03.17
-
seekbar로 만든 진행바에 터치가 안되게 하기
진행바를 seekbar로 만드는 경우, 터치 했을때 바가 움직여 버린다. 다음과 같이 간단히 막아버리자 class TouchlessSeekBar: SeekBar { private var seek: Int constructor(context: Context) : super(context) constructor(context: Context, attrs: AttributeSet) : super(context, attrs) constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) init { seek = 0 thumb = ColorDrawable(Color.TRANSPARENT) //터치아..
2020.03.24
-
전문경영인?의 탄생... 종횡무진 서양사1
서양과 동양의 차이는 어디서 왔을까? 순전히 나의 관심사 안에서 찾아보았다. 책 속의 내용중 일부를 정리해 가면서 살펴보자 이집트에서 메소포타미아까지의 초승달 지역을 오리엔트라고 하는데 여기서 서양의 역사가 시작된다. 아프리카의 이집트와 메소포타미아의 히타이트가 맞붙은 세기의 전쟁에서 세계 최초의 국제조약(여기서 서양의 조약 문화가 시작된다)이 이루어지고, 500년 후 강력한 군사국가 아시리아가 최초의 통일을 이룬다. 아시리아의 뒤를 이은 페르시아는 대제국을 건설하지만, 도시국가(폴리스) 연합체인 그리스와의 전쟁에서 패배하면서 문명의 중심은 그리스로 넘어간다. 동 지중해를 장악한 그리스는 아테네를 중심으로 특별한 번영을 누린다. 민주정의 탄생이 그것이다. 사실 동양의 중국처럼 확실한 구심점이 없어서 가능..
2020.02.26
최신 글
-
SwiftUI TextField 에서 placeholder color 변경하기
안녕하세요 오랜만에 글을 올립니다~ 그동안 나이만 먹고 살림살이는 나아지지 않아 슬프지만.. 오늘도 저처럼 힘겨운 날을 보내고 계실 개발자분들을 위해 조금이라도 힘내시라고 작은 지식 하나 공유해 봅니다 이번 포스팅은 SwiftUI TextField 에서 겪은 삽질? 에서 비롯되었는데요.. 문자를 입력하기 전 디폴트로 뜨는 희미한 도움말인 placeholder 의 글자색이 변경이 안되는 겁니다!! UIKit에선 오래전부터 알려진 방식으로 손쉽게 할수 있었는데, SwitfUI 이넘은 아직 생긴지 얼마 안되서 그런지 구글신의 힘도 미약하고, 잘 안되서... SwiftUI의 특성을 최대한 이용해 아래와 같이 만들어 봤습니다. textfield costom 뷰... import SwiftUI struct Plac..
2022.07.29
-
View를 서서히 나오고 사라지게 하는 간단 방법
Activity를 전환할때 서서히 나오고 사라지는 등의 애니메이션을 넣을 수 있다 당연히 Activity가 아닌 일반 View 도 가능하다 하지만 View 에서는 한가지 주의할 점이 있다. Activity는 전환 애니메이션을 마치면 자동으로 생성되거나 없어지지만 View는 그렇지 않다는 것이다. 즉, 애니메이션이 시작 또는 끝날때 View를 부모뷰에서 빼고 넣거나 보이게 또는 보이지 않게 처리 해주어야 한다. 애니메이션을 불러와 시작하는 코드 //나오기 fun startAnimationWithShow(context: Context, view: View, id: Int) { view.visibility = View.VISIBLE //애니메이션 전에 뷰를 보이게 한다 view.startAnimation(An..
2022.03.13
-
지성,행동,성장 ... 착한 사람이 이긴다
여차여차해서 A+에셋(보험관련 금융사)에서 우리 아이템을 발표 할 기회가 있었다. 물론, 좋은 결과는 없었지만 뜻밖에도 책을 선물받았다. 착한 사람이 이긴다 ... A+그룹의 관근호 회장님의 책이었다. 마침 읽을책을 한권 사야겠다고 생각하던차여서 바로 읽어보았다. 아무래도 직접 경험하신 보험과 회사 이야기가 많았다. 그리고 적절한 비유를 성경 이야기로 덧붙여 설명한것도 인상적이었다. 착한 사람이란 그저 이타적인 사람일까? 도와주었는데 오히려 피해만 주었다면? 내 식구는 외면하고 남만 도와준다면? 과연 착하다고 할 수 있을까? 그렇다. 이것은 그냥 착한척 하는 멍청한 호구다 착해질려면 남을 도울정도로 지성과 능력을 갖추어야 한다. 또한, 행동할 줄 알아야한다. "행동하지 않는 양심은 악의 편이다." 대통령..
2021.08.15
-
어떤 주식이 오를까? 알수 없다... 현명한 투자자
1년전에 읽었던 책인데 이제야서 리뷰를 올린다. 그동안 새 개정판도 나왔다고 하는데.. 요즘 투자에 대한 관심이 높긴 한것 같다. 뭐, 워낙 유명한 투자 고전 서적이기도 해서 겠지만ㅎㅎ 이 책은 워런버핏의 스승으로 더 알려진 벤저민 그레이엄의 명저이다 또한 가치투자를 창설한 분이 바로 이분이니, 가치투자 교과서라고도 할수 있다. 내용이 길어지면 지루할테니 내가 가장 주목한 부분이자 가장 핵심이라고 생각 했던 챕터 2곳만 소개하겠다. 첫번째는 7장 "적극적인 투자자를 위한 포트폴리오 전략: 긍정적인 면" 이다. 여기서 저자가 말하고자하는 바는 공식에 의한 투자 시기 선택은 불가능하다는 것이다. 즉, 우리가 차트 분석을 해서 지금이 살때다!! 하는건 그렇게 믿고 싶을뿐이지 확률적으로는 5:5... 맞으면 좋..
2021.08.01
-
seekbar로 만든 진행바에 터치가 안되게 하기
진행바를 seekbar로 만드는 경우, 터치 했을때 바가 움직여 버린다. 다음과 같이 간단히 막아버리자 class TouchlessSeekBar: SeekBar { private var seek: Int constructor(context: Context) : super(context) constructor(context: Context, attrs: AttributeSet) : super(context, attrs) constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) init { seek = 0 thumb = ColorDrawable(Color.TRANSPARENT) //터치아..
2020.03.24
-
전문경영인?의 탄생... 종횡무진 서양사1
서양과 동양의 차이는 어디서 왔을까? 순전히 나의 관심사 안에서 찾아보았다. 책 속의 내용중 일부를 정리해 가면서 살펴보자 이집트에서 메소포타미아까지의 초승달 지역을 오리엔트라고 하는데 여기서 서양의 역사가 시작된다. 아프리카의 이집트와 메소포타미아의 히타이트가 맞붙은 세기의 전쟁에서 세계 최초의 국제조약(여기서 서양의 조약 문화가 시작된다)이 이루어지고, 500년 후 강력한 군사국가 아시리아가 최초의 통일을 이룬다. 아시리아의 뒤를 이은 페르시아는 대제국을 건설하지만, 도시국가(폴리스) 연합체인 그리스와의 전쟁에서 패배하면서 문명의 중심은 그리스로 넘어간다. 동 지중해를 장악한 그리스는 아테네를 중심으로 특별한 번영을 누린다. 민주정의 탄생이 그것이다. 사실 동양의 중국처럼 확실한 구심점이 없어서 가능..
2020.02.26
-
날짜 텍스트에 일수를 더해보자
우리는 종종 string형 날짜에 int형 일수를 더하는 작업을 하게 된다. 이때, 다음과 같이 간단한 함수를 하나 만들어 사용하자 코틀린으로 작성했다. fun afterDate(date: String, day: Int, pattern: String = "yyyy-MM-dd"): String { val format = SimpleDateFormat(pattern, Locale.getDefault()) val calendar = Calendar.getInstance() format.parse(date)?.let { calendar.time = it } calendar.add(Calendar.DAY_OF_YEAR, day) return format.format(calendar.time) } date에 날짜 ..
2020.01.31
-
Int 난수 함수로 Float 난수 깔끔하게 발생시키기
php 에는 float 난수를 발생시키는 함수가 따로 없다. 그래서 int 난수 함수인 rand() 함수를 이용해 float로 변환해야 한다. 다음은 float 변수형의 최소, 최댓값을 인수로 받아 float 난수를 반환하는 함수이다. 자주 사용할것 같아 만들어 보았다. function randOnFloat($min, $max) { //최소,최대값중에 소수점 자리수가 더 큰쪽을 선택 $radix_min = radix($min); $radix_max = radix($max); $radix = $radix_min[front] > $radix_max[front] ? $radix_min : $radix_max; //입력된 float값을 int값으로 변환후 int난수를 발생시키고 다시 float로 변환한다 ret..
2019.12.26
-
우리 역사속 일상과 상상 사이... 한국괴물백과
불확실한 미래에 대한 작은 위로로써 공상은 오랫동안 인류와 함께 했다. 두려움은 무지에서 온다는 말처럼 무서운 괴물은 아직 알수 없는 것에서 생겨나기 마련이다 그래서 옛날 사람들이 특히, 우리 선조들이 일상에서 어떤 어려움을 겪어 왔는지 괴물 이야기를 통해 알수 있다. 농업사회에선 역시 흉년이 가장 큰 어려움이 아니었을까? 흉년이나 풍년에 관한 괴물들이 많이 나온다. 죽음은 옛날이나 지금이나 큰 두려움이다. 크고 작은 자연재해 또한 당시에는 예측이 더 불가능했을 것이다. 날씨에 관한 괴물도 꽤 보인다. 위생이 좋지 않았던 과거에는 불쾌한 환경이나 질병도 걱정의 대상이었다. 이 책은 제목처럼 백과 형식의 짧은 글로 엮어 있어 틈틈히 가볍게 읽기 좋다. 자신만의 관점으로 상상하며 읽어보면 더욱 좋을듯 하다...
2019.11.30
-
삼각 분포로 난수 발생시키기
가우시안 분포 즉, 정규분포로 난수를 발생시켜야 하는 경우가 종종 있다. 하지만 우리가 흔히 사용하는 rand() 함수는 균일 분포로 난수를 가져오므로 따로 구현해야 한다. 다행히 정규분포 난수 발생 소스는 인터넷상에서 쉽게 구할수 있기 때문에 별 문제 될 건 없다. 한 가지 딴지를 걸자면 정규분포는 피 적분이 안되기 때문에 반복문을 사용해 난수를 만들어야 한다. 만약, 아주 많은 난수를 한꺼번에 발생시킨다면, 부하가 걸릴 수 있다는 말이다. 물론, 아주 쓸데없는 걱정이다. 그정도로 21세기의 컴퓨터는 나약하지 않다ㅎㅎ 어쨌거나 반복문이 없는 확률 밀도 기반 난수를 쓰고 싶다는 어리석은 생각에 다음과 같은 삼각 분포 난수 함수를 만들어 보았다. 삼각형 그래프는 정적분이 쉬워서 면적을 비율 삼아 난수를 발..
2019.10.28