いつもお世話になります。

下記ソースにてビットマップの回転を実現させようとしております。
ソースの一部ですので処理概要を説明すると、
まず、編集用画像領域をimage[][]に格納しておいて、
バッファでデータのやり取りをしており、下記ソースで演算後、
BitBltしております。
そこで、三角関数の処理に公式を利用しているのですが、
どうも左回転してしまいます。右回転したいので
安直に下記RotX・RotYを入れ替えたら右回転したんですけど、
実際の表示位置とは反転してしまいます。
数学的な話だと思うのですが、正常に右回転する方法を
ご存知の方、ご教授よろしくお願い致します。
開発環境はVC++6.0MFCです。


for (y = 0 ; y<Height ; y++) { //オリジナル針のY方向
 for (x=0 ; x<Width ; x++) { //オリジナル針のX方向
  double IncreX=x-2.5;  //針中心からのベクトル
  double IncreY=y-31.5;//針中心からのベクトル
  double RotX= IncreX*::cos(m_dSAngle)-IncreY*::sin(m_dSAngle);
  double RotY= IncreX*::sin(m_dSAngle)+IncreY*::cos(m_dSAngle);
  long Offset = long(50.0+RotY) * 100 + long(50.0+RotX);
  ASSERT(Offset<100*100);
  *(buf+Offset)=image[y][x];
 }
}

A 回答 (2件)

他のソースが見えないので何とも言えませんが、多分ここのところが問題なんだと思いますのでアドバイスさせて頂きます。



DIBでの画像データは左下がオフセットとなり、右方向へなめて一段上へ・・・このように格納されています。
これを理解せずに回転しようとすると、反対方向へ回転しますので、DIBをバイナリレベルで扱う場合は注意してください。
image[0][0]は画像左下の座標なので、y座標の考え方を根本から反転してください。表示位置に影響が出たのはそのためだと思われます。
*DDサーフェイスはちゃんと左上が頂点ですが、過去の解答を見る限りDIBですよね?

また、オリジナル側の画像を参照して回転すると、斜線がガタガタになったり、画像に穴ができたりします。
根本的な対策は、ここで言うところのbuf側から全部の座標を埋めていく事です。
※ここで複数の座標を参照すれば綺麗な中間色が出せます。が、重い・・・

ソースは御自身で作成できると思いますので、頑張ってください。このままでよろしければ、yのあたりをチョコッと直せば済む筈です。
*私はWin32ベース(というか、こういう細かい部分はasm)で作るので、MFCベースのソースはちょっと・・なので。投げやりでごめんなさい。

また、回転拡大縮小はAPIに任せた方が楽だと思いますよ?
結局キャッシュミスが起こるので、アセンブラで作成しても大差ないです。

尚、参照URLの方が的確なアドバイスが選られると思います。
ご参考まで。

参考URL:http://www.bio100.co.jp/
    • good
    • 0

角度の測り方は反時計回りが標準ですから、普通にやったのでは左回転


するでしょうね。
で、時計回りにするには、簡単です。角度をマイナスにすれば良いのです。
ご質問の例ではm_dsAngleを(-m_dsAngle)で入れ替えればよいことになります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QCで回転プログラムの高速化を

Cで、90枚の画像を、それぞれ0度から90度まで回転させるプログラムを作りました。
回転の処理は重く時間がかかるため、
それぞれの角度の回転後の位置を配列に格納して、
その値を参照して画像を回転させていこうと思ったのですが、

例えば、画像が300*300としたら回転座標を入れる配列は2次元で2つとりますよね?
kaitenX[90][300]
kaitenY[90][300]
これで、例えば元画像を50度回転させる時のx,y座標が10,50の所の回転後の座標は
kaitenX[50][10]の値(回転後のx座標の値) と
kaitenY[50][50]の値(回転後のY座標の値)を
参照さしてやればいいと思うのですが、

このとき、回転後の画像をtemp[300][300]という回転後の出力用配列に
代入していくとき、

どうやって代入していけばよいでしょうか?

まさか、

for(r=0;r<90;r++) //rは角度情報
for(i=0;i<300;i++)
for(j=0;j<300;j++)
{
temp[i][j] = Gengazo[r][kaitenx[r][j]][kaiteny[r][i]]
}

なんて風には書けませんよね^^;(自分で一応試したけどダメでした)

回転後の座標を格納するまでは出来ると思うのですが、
格納後、どうやってその値を参照させて、格納させていけばいいか
わかりません。

教えていただけませんでしょうか?

また、もっと高速化できる効率の良い方法があれば教えて下さい。

Cで、90枚の画像を、それぞれ0度から90度まで回転させるプログラムを作りました。
回転の処理は重く時間がかかるため、
それぞれの角度の回転後の位置を配列に格納して、
その値を参照して画像を回転させていこうと思ったのですが、

例えば、画像が300*300としたら回転座標を入れる配列は2次元で2つとりますよね?
kaitenX[90][300]
kaitenY[90][300]
これで、例えば元画像を50度回転させる時のx,y座標が10,50の所の回転後の座標は
kaitenX[50][10]の値(回転後のx座標の値) と
kaitenY[50][50]の...続きを読む

Aベストアンサー

ANo.4の補足に対する回答です。

> > 回転後の座標から回転前の座標を参照できるようにしたほうがよいの>ではないですか?
> >も正にその通りで、参照の紐付けを逆にしておけば、代入の必要がな>くなります。
>
> この部分の方法がよくわかりませんでした。参照の紐付けをすれば代入の必要がなくなる。
> というのが、具体的にどうすればよいのか検討がつきませんでした。

(回転後のx座標)=(回転前の座標、回転)
(回転後のy座標)=(回転前の座標、回転)
ではなく、
(回転前のx座標)=(回転後の座標、回転)
(回転前のy座標)=(回転後の座標、回転)
とするべきだ、ということです。
必要なのは後者だけなのに、紐付けを前者の方式でやっておいて、改めてループで
後者に変換しようとしています。
始めから紐付けを後者の方式でやっておけば、わざわざ代入しなくて済みます。

> 時間がかかるのは、Cos Sinの計算なんですね!!(回転全体のプログラムが遅いのかと思ってました)
> 先に、その計算をしてやって、配列に入れておけば、
> 後は普通に回転のプログラムを組んで、Cos Sinの計算の部分だけ、
> 最初に作っておいた配列を参照してやるように作ればいいということですよね?

そうです。三角関数に限らず、平方根[sqrt()]、対数[log()]など、四則演算に展開できないものは
みんな計算が遅いです。(厳密には、四則演算の中でも割り算は遅いです。)
計算が遅いものをテーブル化しておくのは、高速化の際の上等手段です。

> 回転前の現画像のx座標,y座標って、普通に(0,0)~(300,300)ですよね?
> 自分の場合、最初に90枚の画像をsrc[90][300][300]に一気に取り込んでしまってます。
> いわば、この添え字が回転前のx,y座標だと思うのですが・・・

「最初に90枚の画像を取り込む」という処理は、厳密には画像ではなく、座標の取り込みだけですよね?
だったら、どんな画像でも同じ処理を行うのでプログラムで計算する必要性はなく、
これも別途計算しておいてテーブル引きが可能です。
(回転前のx座標)=(回転後の座標、回転)
(回転前のy座標)=(回転後の座標、回転)
の2つの配列を、sinやcosで計算するのではなく、データとしてプログラムに直書き
することができるという意味です。

また、前回の回答で抜けていましたが、表示の際に画像のBITイメージをVRAMに展開する処理が
あると思いますが、その際の計算量をなるべく減らすのが、実行時の高速化に繋がります。
具体的には、座標のデータだけでなく、BITイメージを90枚分あらかじめ作っておくということです。
(既にやっていますか?)
可能なら、VRAMと同じメモリ形式に90枚分のイメージをあらかじめ作っておいて、
表示の際にはVRAMにmemcopy()するだけにできれば理想的ですが。

ANo.4の補足に対する回答です。

> > 回転後の座標から回転前の座標を参照できるようにしたほうがよいの>ではないですか?
> >も正にその通りで、参照の紐付けを逆にしておけば、代入の必要がな>くなります。
>
> この部分の方法がよくわかりませんでした。参照の紐付けをすれば代入の必要がなくなる。
> というのが、具体的にどうすればよいのか検討がつきませんでした。

(回転後のx座標)=(回転前の座標、回転)
(回転後のy座標)=(回転前の座標、回転)
ではなく、
(回転前のx座標)=(回...続きを読む

Q画像を読み込む配列の確保。

C言語について質問です。
画像を読み込む時、その画像の幅、高さを入力し、そのサイズに見合った配列を確保します。その後ファイル名を入力し、配列に読み込むプログラムを作成しました。

メインの部分のみ記述します。

int xsize, ysize, i;
unsigned char **src;
char filename[30];
FILE *fp;

printf("ファイル名を入力してください:"); scanf("%s", filename);
printf("画像の幅:");scanf("%d", &xsize);
printf("画像の高さ:");scanf("%d", &ysize);

src = (unsigned char **)malloc(sizeof(unsigned char *) * ysize);
for(i=0; i<ysize; i++)
src[i] = (unsigned char *)malloc(sizeof(unsigned char) * xsize);
fp = fopen(filename, "rb");
fread(src[0], sizeof(unsigned char), xsize * ysize, fp);


このように記述し、エラーもなく実行できたのですが、srcをこのまま出力すると変?な画像となって出力されてしまいました。
上のように記述した場合、矛盾する場所はあるでしょうか?
そして、この方法以外に配列を確保する方法はあるでしょうか?

C言語について質問です。
画像を読み込む時、その画像の幅、高さを入力し、そのサイズに見合った配列を確保します。その後ファイル名を入力し、配列に読み込むプログラムを作成しました。

メインの部分のみ記述します。

int xsize, ysize, i;
unsigned char **src;
char filename[30];
FILE *fp;

printf("ファイル名を入力してください:"); scanf("%s", filename);
printf("画像の幅:");scanf("%d", &xsize);
printf("画像の高さ:");scanf("%d", &ysize);

src = (unsigned char **)malloc(si...続きを読む

Aベストアンサー

★最初に ysize 分のポインタを管理領域と呼んでいません。
・プログラマが malloc(1000) として 1000 バイトを確保した場合、
 実際のメモリ上には
 (1)malloc() 関数がメモリ確保の管理情報を数バイト保持(8~16バイトほど)
 (2)実際にプログラマが使用できる 1000 バイトの領域
 となります。つまり、使用できる 1000 バイトの領域の先頭に数バイトのメモリ管理情報が
 存在するのです。
・詳しい内部の仕組みは分かりませんが、確保したメモリ領域をリストデータで管理していると
 思います。リストデータはポインタで次々にデータをチェインしますよね。
 そのとき、次のデータ位置を表すポインタや確保サイズなどの数バイトが malloc() 関数などの
 メモリ管理情報(領域)として存在するわけです。
・以上を踏まえて回答 No.4 を読んでみて下さい。
 もう少し分かりやすく説明すると
 char *a = malloc(1000);
 char *b = malloc(2000);
 char *c = malloc(3000);
 char *d = malloc(4000);
 の4つのメモリは合計で 10000 バイト確保され 10000 バイトを使用できます。
 でも、実際のメモリ上には、メモリ管理情報(領域)=ヘッダが存在しますので
 a…8 + 1000
 b…8 + 2000
 c…8 + 3000
 d…8 + 4000
 で合計 10032 バイトのメモリを消費します。なお、8 バイトが管理情報ですが、昔使っていた
 コンパイラを調べたときのサイズです。今はどれくらいか分かりませんが数バイトはあります。
・メモリを節約したい場合は、回答者 No.5 さんのマクロ関数が一番節約できると思います。
 前回も同じような感じでアドバイスしたときにマクロ関数を紹介しようと思いましたが、
 それを使うのがスッキリしなくて unsigned char **src を使って src[y][x] とアクセスしたいのかと
 思いましたのでマクロ使用の紹介は控えました。が、他の回答者さんのお礼にマクロ関数のことが
 よく分からないとなっていましたね。今回はマクロ関数を利用する方がメモリを節約できます。
・マクロ関数を利用すれば、画像の横×高さのサイズ分だけ確保すればよいので src[] のポインタ分の
 メモリは節約できます。
・以上。malloc() などは『実際のメモリ使用量=メモリ管理情報(領域)+確保サイズ』です。

★最初に ysize 分のポインタを管理領域と呼んでいません。
・プログラマが malloc(1000) として 1000 バイトを確保した場合、
 実際のメモリ上には
 (1)malloc() 関数がメモリ確保の管理情報を数バイト保持(8~16バイトほど)
 (2)実際にプログラマが使用できる 1000 バイトの領域
 となります。つまり、使用できる 1000 バイトの領域の先頭に数バイトのメモリ管理情報が
 存在するのです。
・詳しい内部の仕組みは分かりませんが、確保したメモリ領域をリストデータで管理していると
 思います。リ...続きを読む

QDirectX png画像でx軸回転について

D3DXCreateTextureFromFile関数でpng画像を読み込んで、LPD3DXSPRITEのスプライト機能で描画しています。
float rad += 0.005f;という感じでラジアン値を変えつつ回転の様子を調べているのですが、どうも予想通りに動いてくれません。

D3DXMatrixRotationZでz軸回転させると、一定間隔でくるくる回ってくれて、これは予想通りです。
しかしD3DXMatrixRotationXでx軸回転させようとすると、一瞬で画像が縮んでしばらく消えてから、また一瞬の内に伸びて縮んでしばらく消える、という事の繰り返しになります。

なぜx軸(y軸もですけど)の時だと、上手く回転してくれないのでしょう?
そして、どのように値を与えれば、一定間隔でくるくる回ってくれるようになるのでしょうか?
どうかよろしくお願いします。

Aベストアンサー

>3D としてレンダリングしていない
スプライトの描画時に Begin をしているはずです。
参考:DirectX SDKドキュメント日本語版
 DirectX Graphics >
  リファレンス >
   D3DXリファレンス >
    ID3DXSprite >
     Begin メソッド

D3DXSPRITE_OBJECTSPACE を指定してワールド座標行列を
設定してやればできた気がします。
(できなかったらごめんなさい)

QRun-Time Check Failure #3というエラーが出ます。

//Run-Time Check Failure #3 - The variable 'Data' is being used without being defined.
//というエラーが出ます。どうしたらいいですか?
//プログラムの内容は、数値を格納するときに、二分木構造で格納していくというものです。
//多分違うような気がしますが、、
//よろしくお願いします。
#include<stdio.h>

struct DATA
{
DATA *Small;
DATA *Large;
int Number;
};
void InputData(DATA *Dat,int num)
{
if(Dat==NULL){Dat=new DATA;Dat->Number=num;return;}
if(Dat->Number<num)
{
Dat->Large=new DATA;
Dat=Dat->Large;
InputData(Dat,num);
}
else if(Dat->Number>num)
{
Dat->Small=new DATA;
Dat=Dat->Small;
InputData(Dat,num);
}
return;
}
int main()
{
DATA *Data;
InputData(Data,20);//<-ここでエラーが出ます。
InputData(Data,10);
InputData(Data,30);
return 0;
}

//Run-Time Check Failure #3 - The variable 'Data' is being used without being defined.
//というエラーが出ます。どうしたらいいですか?
//プログラムの内容は、数値を格納するときに、二分木構造で格納していくというものです。
//多分違うような気がしますが、、
//よろしくお願いします。
#include<stdio.h>

struct DATA
{
DATA *Small;
DATA *Large;
int Number;
};
void InputData(DATA *Dat,int num)
{
if(Dat==NULL){Dat=new DATA;Dat->Number=num;return;}
if(Dat->Number<num)
{...続きを読む

Aベストアンサー

とりあえず、題名のエラーに付いてですが、
それは、mainの中での初期値を設定していない為に、
変数に不定値が入っていた為に起こった現象です。

で、#2に付いての質問ですが、まずは、main関数での宣言の
DATA *Data ;
は、アドレスを格納する変数と言うことです。

また、InputData関数の引数の
DATA **Datに付いては
アドレスを格納する変数のアドレスを引数とするという事です。

ですから、質問時のInputDataの引数の
DATA *Datでは
Datと言う変数のアドレスを受け取ると言うことで
アドレスを格納する変数では無く、実体(値)を格納する変数となります。

で、#2のようにDATA **Datとすると *Datのアドレスを
受け取ると言うことになり、アドレスを格納する
変数と言うことに成ります。
(引数で記述するのはあくまでも変数宣言と同等です。)

以上が今回のエラー及びプログラムの間違いです。
(説明が下手で申し訳ありませんm(_ _)m)

詳しいアドレス及びポインタに付いては、C言語の
書籍にポインタに付いて記述されていると思いますので
探してみてください。

でも、ポインタに付いて詳しい説明をしている書籍って
・・・本1冊分になるような気がする(汗

それと、余計なアドバイスに成りますが、
ローカル変数とグローバル変数の違いもお勉強されると
良いかもしれませんね。
ローカル変数は、宣言するだけでは初期値は不定とかね。(だから、必ず初期化が必要なんです。)
そうすれば、今回のエラーの意味もすぐにわかると思います。

これも、余計な事かもしれませんが、#2の
お礼の部分に記述してあるプログラムに付いてですが、
せっかくですから、InputDataの中でデータと
データの間に挿入すると処理を追加すれば、
DATA *Top;
DATA *TopTmp;
をmainで使用しなくても動作すると思います。

では、頑張って見て下さい。

とりあえず、題名のエラーに付いてですが、
それは、mainの中での初期値を設定していない為に、
変数に不定値が入っていた為に起こった現象です。

で、#2に付いての質問ですが、まずは、main関数での宣言の
DATA *Data ;
は、アドレスを格納する変数と言うことです。

また、InputData関数の引数の
DATA **Datに付いては
アドレスを格納する変数のアドレスを引数とするという事です。

ですから、質問時のInputDataの引数の
DATA *Datでは
Datと言う変数のアドレスを受け取ると言うことで
アドレ...続きを読む

Q画像の拡大・縮小

読み込んだ画像を1.5倍に拡大、2/3倍に縮小したいのですが、C言語でそのようなことは可能なのですか?また、できるとしたら、どのように行えばいいのでしょうか?教えてくださいm(_ _)m

Aベストアンサー

座標系だけでしたら処理は単純です。
単に倍率をかけてあげればよいだけです。

具体的な計算式は、
(1.5倍の例)
 Image( x*1.5, y*1.5 ) = Image( x, y )
ということです。

これだけでは多分わからないですね^_^;
以下にプログラムを書きます。

----------------------------------------------------------------

void main()
{
 unsinged char Image[ 16 ][ 16 ]; // 読み込んだ画像の格納場所
 unsinged char Image2[ 24 ][ 24 ]; // 拡大した画像の格納場所
 double zoom = 1.5;
 int x, y;
 int i, j;

/*
  画像の読み込み処理
*/

 for(x=0; x<16; x++)
 {
  for(y=0; y<16; y++)
  {
   // 拡大した時に隙間が空くので、その箇所を補完する
   for(i=0; (double)i<zoom; i++)
   {
    for(j=0; (double)j<zoom; j++)
    {
     Image2[ (int)(x*zoom)+i ][ (int)(y*zoom)+j ] = Image[ x ][ y ];
    }
   }
  }
 }
}

----------------------------------------------------------------

これでImage2に1.5倍した画像が格納されるはずです。
(注:Image2の配列のサイズは任意に決めています)

理解できたでしょうか。

画像の拡大縮小に関しては、まだ多くの手法が存在しますので、
調べてみると面白いかもしれませんよ(^_^)

座標系だけでしたら処理は単純です。
単に倍率をかけてあげればよいだけです。

具体的な計算式は、
(1.5倍の例)
 Image( x*1.5, y*1.5 ) = Image( x, y )
ということです。

これだけでは多分わからないですね^_^;
以下にプログラムを書きます。

----------------------------------------------------------------

void main()
{
 unsinged char Image[ 16 ][ 16 ]; // 読み込んだ画像の格納場所
 unsinged char Image2[ 24 ][ 24 ]; // 拡大した画像の格納場所
 double zoom = 1.5...続きを読む

Qエクセル STDEVとSTDEVPの違い

エクセルの統計関数で標準偏差を求める時、STDEVとSTDEVPがあります。両者の違いが良くわかりません。
宜しかったら、恐縮ですが、以下の具体例で、『噛み砕いて』教えて下さい。
(例)
セルA1~A13に1~13の数字を入力、平均値=7、STDEVでは3.89444、STDEVPでは3.741657となります。
また、平均値7と各数字の差を取り、それを2乗し、総和を取る(182)、これをデータの個数13で割る(14)、この平方根を取ると3.741657となります。
では、STDEVとSTDEVPの違いは何なのでしょうか?統計のことは疎く、お手数ですが、サルにもわかるようご教授頂きたく、お願い致します。

Aベストアンサー

データが母集団そのものからとったか、標本データかで違います。また母集団そのものだったとしても(例えばクラス全員というような)、その背景にさらならる母集団(例えば学年全体)を想定して比較するような時もありますので、その場合は標本となります。
で標本データの時はSTDEVを使って、母集団の時はSTDEVPをつかうことになります。
公式の違いは分母がn-1(STDEV)かn(STDEVP)かの違いしかありません。まぁ感覚的に理解するなら、分母がn-1になるということはそれだけ結果が大きくなるわけで、つまりそれだけのりしろを多くもって推測に当たるというようなことになります。
AとBの違いがあるかないかという推測をする時、通常は標本同士の検証になるわけですので、偏差を余裕をもってわざとちょっと大きめに見るということで、それだけ確証の度合いを上げるというわけです。

Q画像の合成プログラム

現在、飛行機の羽の左側と、右側の羽で撮った2枚の航空写真を合成するプログラムを作っています。これらの画像には若干のずれがあり、合成するには、左の写真に写っている場所と対応する同じ点を右側の写真から探索する必要があります。今の段階で作っているプログラムでは全ての点を走査することができず、画像の一部だけしか走査されません。
以下のプログラムをどのように変更したら、画像全体を走査できるかアドバイスください。お願いします。
/*対応点の探索*/
for (x = 0; x < 512; x+=25) {
for (y= 0; y < 512; y+=25) {
for (i = 0; i < 30; i++) {
for (j = 0; j < 30; j++) {
block1[i][j] = image1[x - 30 / 2 + i][y - 30 / 2 + j];
}
}
min = 99999;
x1 = x*2;
if(x1 > 512){
x1 = 512;
}
y1 = y*2;
if(y1 > 512){
y1 = 512;
}
for (i = 30 / 2; i < x1 - 30 / 2; i++) {
for (j = 30 / 2; j < y1- 30 / 2; j++) {
sa = 0;
for(k = 0; k < 30; k++) {
for(l = 0; l < 30; l++) {
sa += abs(block1[k][l] - image2[i - 30 / 2 + k][j - 30 / 2 + l]);
}
}
if (min > sa) {
min = sa;
min_i = i;
min_j = j;
}
}
}
if(x-15 < min_i && min_i < x+15){
if(y-15 < min_j && min_j < y+15){
printf("File_1の座標点( %d, %d )の対応点は ( %d, %d ) である。\n",y,x, min_j, min_i);
}
}
}
}
return 0;
}

現在、飛行機の羽の左側と、右側の羽で撮った2枚の航空写真を合成するプログラムを作っています。これらの画像には若干のずれがあり、合成するには、左の写真に写っている場所と対応する同じ点を右側の写真から探索する必要があります。今の段階で作っているプログラムでは全ての点を走査することができず、画像の一部だけしか走査されません。
以下のプログラムをどのように変更したら、画像全体を走査できるかアドバイスください。お願いします。
/*対応点の探索*/
for (x = 0; x < 512; x+=25) {
for (y= 0...続きを読む

Aベストアンサー

>block1[i][j] = image1[x - 30 / 2 + i][y - 30 / 2 + j];
って
block1[i][j] = image1[(x - 30) / 2 + i][(y - 30) / 2 + j];

じゃなくてもいいんですよね?
気になったので…。

QC、C++、C#の関係について

現在C#で簡単な開発しています。

今度就く業務ではC++が必要だから、勉強しておくようにと言われました。
C#を使っていながら、恥ずかしい質問なのですが・・・

 ・よく聞く「VC++」と「C++.Net」は、違うのでしょうか?
  正式名称が「Microsoft Visual C++ .Net」なので、同じような気がするのですが。
  私の使用PCには「Microsoft Visual Studio .Net 2003」が入っています。

 ・C言語とC++との違いは何なのでしょうか?
  両者の関係が分かりません。
  C++を勉強する場合、C言語というのは飛ばしてよいのでしょうか?
  C#を習得するときは、C言語を勉強しませんでした。
  C++で開発とか、C#で開発とか言いますが、「C言語で開発」とは言わないですよね?

C#とC++がどれほど違うのかが不安です。
質問がたくさんになってしまいましたが、よろしくお願いいたします。

Aベストアンサー

 ・よく聞く「VC++」と「C++.Net」は、違うのでしょうか?

文脈により違うものをさす可能性もあります。(同じ可能性もありますが、大抵は違うかも…)

「VC++」は、Microsoft社のC++コンパイラ製品名(の略称)であって、言語ではないです。
但し、特にMFCでの開発をさして(C++と区別して)「VC++」と表現する方もいます。

そして、「VC++」は、「非.NET platformのC++(標準C++)」と、
.NET platform用のManaged C++(MSの独自拡張。後に整理されてC++/CLIとして規格化)の*両方に*対応してます。

C++.NETというと、恐らくはManaged C++(MS独自拡張)か、
C++/CLI(これはECMAで独立した言語として標準化)をさすと思われます。
# Managed C++とC++/CLIも微妙に違う言語です。

一報、単にVC++と言う場合、標準C++(+MFC)の可能性が高いです。


> 私の使用PCには「Microsoft Visual Studio .Net 2003」が入っています。

これは、.NET framework上のManaged C++と標準C++の両方に対応した製品です。

 ・C言語とC++との違いは何なのでしょうか?

C言語は、ISO/IEC9899で標準化された言語です。
C++は、C言語をベースに開発された別の言語です(ISO/IEC14882)。
そして、.NET framework用のC++/CLI (ECMA-372)も別の言語です。

CとC++の関係を例えるなら、ラテン語と英語とかみたいなものでしょうか。
(ベースでもあり、参考にはなるが、似て非なるもの)

> C++を勉強する場合、C言語というのは飛ばしてよいのでしょうか?

知っているとお得です。知らないと将来「はまる」可能性もあります。
ですが、最初に勉強するべきかといわれると、議論が分かれるところだと思います。

> C++で開発とか、C#で開発とか言いますが、「C言語で開発」とは言わないですよね?

「C言語で開発」とも言います。
(PCアプリだと「C言語+Win32」ということが少ないだけで、組込業界等に行くと普通にあります。別言語ですし、C言語のシェアも高いので)

> C#とC++がどれほど違うのかが不安です。

根本のOOPとかは共通ですが、C++の方が格段に複雑で難易度が高いです。
C++⇒C#は比較的容易ですが、逆は結構面倒だと思います。

C#がオートマ車の運転なら、C++はF1カーのようなもの。
クラッチの切り方から注意しないとエンストしたり、事故ります。
その代わり極めれば性能が出ます。(反面、極めるのは困難です)

 ・よく聞く「VC++」と「C++.Net」は、違うのでしょうか?

文脈により違うものをさす可能性もあります。(同じ可能性もありますが、大抵は違うかも…)

「VC++」は、Microsoft社のC++コンパイラ製品名(の略称)であって、言語ではないです。
但し、特にMFCでの開発をさして(C++と区別して)「VC++」と表現する方もいます。

そして、「VC++」は、「非.NET platformのC++(標準C++)」と、
.NET platform用のManaged C++(MSの独自拡張。後に整理されてC++/CLIとして規格化)の*両方に*対応してます。

C++.NET...続きを読む

Q画像編集ソフトの作り方

このカテゴリで質問していいものなのかわからなかったのですが、
現在C、C++で簡単なペイントソフトを作ろうと思っています。
ですが、こんなこと初めてなのでどうはじめたらよいか・・・

アドバイスをいただけたらと思いました。
よろしくお願いします。

開発環境は
Windows XP
863 MHz
192MB RAM
Visual Studio 2005
です。(ちょっと悪いですね。・・・)

出来ればどのプログラミング言語がいいとか・・・
こういうサイトを見るといいとか・・・
最初に何を勉強すればいいのか・・・
など初心者の私にはどれもほしい情報です。よろしくお願いします。

Aベストアンサー

#4です。

>今から勉強したとしてどれくらいでグラフィックソフト開発までにいたるか知りたいです。

完成度次第なんですが。
単に、マウスで指定した2点間を基準に線を引いたり、四角や円を描くだけなら数時間~数日(C#込み)です。
.NETで、「線を引く」「四角を書く」「bmpで保存する」というのは、割とサンプルが多いので。

その先、フィルタリングとなると、色々な処理があるので、難易度は高くなります。ですからまずGraphicsクラスでできることを一通りやってみてはどうでしょうか?


>なので、C#の取得をするべきか、C++でやるか、今悩みました。
.NETでやる限り、C++をGUIプログラミングに使うのはメリットがないと思いますよ。Linuxで、というなら別ですが。

>というよりももっと手軽なオープンソースは知りませんか?
まず貴方のゴールが分からないと。
簡単なペイントソフト(線を引く、四角、円を描く、色を塗る)なら、繰り返しますがC#で数日です。
Paint.NET, GIMP等を目指すなら、数ヶ月~数年ですね。

参考URL:http://wisdom.sakura.ne.jp/programming/cs/index.html,http://wisdom.sakura.ne.jp/system/msnet/index.html

#4です。

>今から勉強したとしてどれくらいでグラフィックソフト開発までにいたるか知りたいです。

完成度次第なんですが。
単に、マウスで指定した2点間を基準に線を引いたり、四角や円を描くだけなら数時間~数日(C#込み)です。
.NETで、「線を引く」「四角を書く」「bmpで保存する」というのは、割とサンプルが多いので。

その先、フィルタリングとなると、色々な処理があるので、難易度は高くなります。ですからまずGraphicsクラスでできることを一通りやってみてはどうでしょうか?


>な...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報