파이어폭스를 실행했을 때 아래와 같은 페이지 대신 자주가는 페이지 모음을 띄우는 방법입니다.




주소창에 about:config를 입력하면 그림과 같은 화면이 나오는데

그냥 버튼을 눌러서 들어갑니다.






Search(검색)창에 homepage를 입력하면

browser.startup.homepage항목이 있습니다.

이 항목을 더블클릭합니다.




우분투용 파이어폭스는 about:startpage로 설정되어 있고

윈도우용은 about:home으로 되어 있는데

이것을 about:newtab으로 바꿔줍니다.






이제 파이어폭스를 닫고 다시 실행해 보면 새 탭 페이지가 뜹니다!







http://tibyte.kr/218 에서 이어집니다.




주의) Matlab에서는 특정 분포를 하는 다양한 난수생성을 지원합니다.

이 포스트는 코드를 간단히 구현해 보기 위한 목적으로 matlab을 사용합니다.



정규난수를(normal random variable)얻기 위해 박스-뮬러 변환(Box-Muller Transform) 을 쓸 수 있지만


연산과정에 삼각함수가 들어 있기 때문에

이 복잡성을 해결하기 위해 George Marsaglia가 고안한 극좌표법(polar method)을 쓸 수 있다.




박스뮬러 방법에서 균일랜덤변수 u를 사용하여  sin(2pi*u)와 cos(2pi*u)로 나타냈던 것을

극좌표법에서는 원 위에 무작위로 점(u1, u2)을 찍어서 cos이 밑변/빗변,

sin이 높이/빗변인 것을 이용하여  삼각함수를 대체한다. 


박스뮬러 방법에서의 U1이 거리제곱(sq)으로 대체되고,

삼각함수 대신 제곱과 제곱근연산이 들어가게 된다.

[그림 1]





매틀랩 코드로 구현한 결과이다. 표준편차가 1이고 평균이 0인 정규분포를 생성. 


N = 1000000;

u1 = zeros(1,N);

u2 = zeros(1,N);

wsq = zeros(1,N);

for i=1:N

   sq = 2;

   while sq>1

      r1 = rand;

      r2 = rand;

      sq = r1.*r1 + r2.*r2;

   end

   u1(i) = r1;

   u2(i) = r2;

   wsq(i) = sq;

end

s = 1;

m = 0;

x = m+s*sqrt(-2*log(wsq)).*u1./(wsq.^0.5);

y = -1.*(m+s*sqrt(-2*log(wsq)).*u2./(wsq.^0.5));

n = horzcat(x,y);

hist(n, 50);



히스토그램 결과.


[그림 2]





이 방법의 단점은 [그림 1]과 코드에서 볼 수 있듯이

점이 원 밖에 찍혔을 경우 평균적으로 1.27배 만큼 난수를 다시 뽑아야 한다는 것이다.

(1.27배는 기하분포의 급수로 계산)










매틀랩에서는 normrnd()함수로 정규난수(normal random variable)를 발생시킬 수 있긴 하지만

여기서는 균일분포(균등분포)를 변환하여 생성해보도록 한다. 



균일분포(uniform distribution)인 랜덤변수와

박스뮬러 변환(Box-Muller Transformation)을 이용하여 정규난수(Gaussian Random)을 만들 수 있다.


아래는 매트랩으로 작성한 코드와 실행결과이다.



format long

N = 1000000;

u1 = rand(1,N);

u2 = rand(1,N);

s = 1;

m = 0;

x = m+s*sqrt(-2*log(u1)).*cos(2*pi*u2);

y = m+s*sqrt(-2*log(u1)).*sin(2*pi*u2);

n = horzcat(x,y);

hist(n, 50);









- 매틀랩의 다양한 plot들을 사용해서 그려본 도표들.










- 누적분포함수(cdf)






극좌표 방법(polar method)에 대해서는 다음 글에 이어집니다.


관련글 : http://tibyte.kr/219






세 점(기준점, 점1, 점2)이 있을 때 atan()함수를 1번만 써서 사잇각을 구하는 방법이다.

원리는 간단하다.


아래와 같이 한 각과 기준각이 이루는 각도를 α, 나머지 각을 β라 한다.



그러면 θ = α - β 라 할 수 있다.


tanθ는 다음과 같이 나타낼 수 있으므로 sinθ와 cosθ를 구하여 atan2의 각 매개변수로 넣으면 각을 알 수 있을 것이다.


먼저 sinθ는 삼각함수의 덧셈정리에 의해 이렇게 전개할 수 있다.


위 식을 처음에 주어진 x분과 y성분으로 나타낼 수 있으므로,

최종적으로는 이렇게 쓸 수 있다.




코사인세타도 같은 방법으로 전개한다.


공통항인 1/l1l2를 소거하면 아래와 같은 표현식을 얻을 수 있다.



angle = atan2(y1x2-x1y2, x1x2+y1y2);




atan2 함수가 아닌 atan함수를 사용한다면 atan(sin값/cos값) 형태로 사용하면 될 것이다.

→ angle = atan(y1x2-x1y2 / x1x2+y1y2);



▼ 컴퓨터 프로그램으로 작성하여 구동한 화면.





펄린노이즈(perlin noise)를 연습하다가 나온 실패작(?).

아래에 코드(ActionScript3.0)가 있지만 펄린노이즈 코드는 아닙니다.

그래도 그냥 올려봅니다...







package
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.Rectangle;
    import flash.geom.Vector3D;
    import flash.utils.setInterval;
   
   
    public class Main extends Sprite
    {
       
        public function Main():void
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
       
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
           
   
            var bd:BitmapData = new BitmapData(500, 500, false);
            var bmp:Bitmap = new Bitmap(bd);   
            bmp.x = bmp.y = 50;
            addChild(bmp);
           
            var vertices:Vector.<Vector.<Vector3D>> = new Vector.<Vector.<Vector3D>>();
            for (var i:int = 0; i < 10; i++) {
                vertices[i] = new Vector.<Vector3D>();
                for (var j:int = 0; j < 10; j++) {
                    vertices[i][j] = new Vector3D(uRand(), uRand());
                    trace(i, j);
                    if(i>0 && j>0)
                        noise50(bd, i*50,j*50,vertices[i-1][j-1], vertices[i][j-1], vertices[i-1][j], vertices[i][j]);
                }
            }
               

           
           
       
        }
       
        private function uRand():Number
        {
            return Math.random()*2-1;
        }
       
        private function noise50(bd:BitmapData, destX:int, destY:int, gx0y0:Vector3D, gx1y0:Vector3D, gx0y1:Vector3D, gx1y1:Vector3D):void
        {
            var x0:Number = 0;
            var y0:Number = 0;
            var x1:Number = 1;
            var y1:Number = 1;   

           
            for (var yi:Number = 0.00; yi < 1; yi+=0.02) {
                for (var xi:Number = 0.00; xi < 1; xi+=0.02) {
                    var s:Number = gx0y0.dotProduct(new Vector3D(xi-x0, yi-y0));
                    var t:Number = gx1y0.dotProduct(new Vector3D(xi-x1, yi-y0));
                    var u:Number = gx0y1.dotProduct(new Vector3D(xi-x0, yi-y1));
                    var v:Number = gx1y1.dotProduct(new Vector3D(xi-x1, yi-y1));
                   
                    var sxi:Number = 3*(xi-x0)*(xi-x0) - 2*(xi-x0)*(xi-x0)*(xi-x0);
                    var syi:Number = 3*(yi-y0)*(yi-y0) - 2*(yi-y0)*(yi-y0)*(yi-y0);                   
                    var a:Number = s+sxi*(t-s);
                    var b:Number = u+sxi*(v-u);                   
                    var zi:Number = a+syi*(b-a);
                   
                    bd.fillRect(new Rectangle(destX+xi*50,destY+yi*50,1,1),0x010203*int((zi+0.5)*4095));
                }
            }
        }
       
    }
   
}


티스토리 블로그를 처음 만든 지 벌써 5년이 됐네요...

이제 방학도 했으니 다시 포스팅을 시작해봐야겠네요.













ArrayAdapter<String>을 이용해 ListView에 String배열 데이터를 넣고
커스텀뷰를 적용한 사례이다.


리스트뷰의 글자크기나 요소간 간격(item height / element height)도 조절할 수 있다..


listView1은 activity_main.xml에서 배치한 리스트뷰의 아이디이다
소스파일(*.java)에서 ListView객체와 String배열을 정의한다
ListView view = (ListView)findViewById(R.id.listView1); 
String[] values = new String[LIST_NUM]; 
for(int i=0; i<LIST_NUM; i++) {
    values[i] = i;
}
그리고 어레이어댑터를 만들어 뷰에 적용.
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.my_text_view, values);
view.setAdapter(adapter);

바로 위의 코드에서 my_text_view는 임의로 이름 붙인 커스텀뷰인데, 이제 이것을 만들어야 한다
프로젝트 경로에서 res\layout(메인액티비티 레이아웃이 있는 폴더)에 새로운 xml 파일을 만든다.
이름은 위 코드에서 쓴 것과 같아야 한다.(여기서는 my_text_view.xml)

실제로 적용했었던 코드를 그대로 옮겨보면,
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:gravity="center_vertical"
    android:paddingStart="2dip"  //패딩(테두리 여백)
    android:textSize="21sp"  //글자 크기
    android:textColor="#EEEEEE"  //글자색
    android:minHeight="34dp"  //리스트 요소 폭
/>



다음과 같은 레아이웃이 적용된 리스트가 표시된다.

(https://play.google.com/store/apps/details?id=com.zetagate.pitchspeed)



GetNext()는 pos값을 다음 값으로 만들기 때문에

먼저 임시변수를 만들어 현재 pos값을 저장해두고 그 임시변수 위치에 해당하는 요소를 지워야 한다.


POSITION pos = list.GetHeadPosition();

POSITION posTemp;

while(pos != NULL) {

    posTemp = pos;

    CMyType myType = list.GetNext(pos);

    if(....CMyType이 요소삭제조건일 때) {

       list.RemoveAt(posTemp);

    }

}



POSITOIN타입이

typedef __POSITION* POSITION;

와 같이 정의되어있기 때문에 getNext()에서 pos값을 변경할 수 있는것이다.


SWF파일과 동영상파일 각각 첨부.






+ Recent posts