式自体は何のことはない。問題はGimpのScript-Fuでやりたいので結構手間取った。
さすがにGimpのScript-Fuコンソールから実験するのは環境が悪すぎたので、RacketをインストールしてScheme環境を作った。
remainderは剰余。
;; 画素番号と画像幅からx座標を計算 (define (getx pos width) (remainder pos width) ) ;; x座標と画素番号と画像幅からy座標を計算し、x,yで返す (define (getxy x pos width) (list x (/ (- pos x) width) ) ) ;; 画素番号と画像幅からx,y座標を計算する (define (2dcoord pos width) (getxy (getx pos width) pos width) )
width=50の画像の1162番のx,y座標は(12,23)。
// x,yから画素番号を算出 inline int calcpos(int x, int y,int width) { return y * width + x; } // 画素番号と画像幅からx座標を計算 int getx(int pos, int width) { return pos % width; } // 画素番号とx座標と画像幅からy座標を計算 int gety(int x, int pos, int width) { return (pos - x) / width; } int main() { int width = 50; int height = 25; int x = 12; int y = 23; int pos = calcpos(x, y, width); //1162 printf("pos %d\n", pos); int xx = getx(pos, width); int yy = gety(xx, pos, width); printf("xx %d\n", xx); printf("yy %d\n", yy); }