C# visual studio2022でVector型を使えるようにする への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 祈り星  (社会人) 投稿日時 2023/10/6 16:34:46
たくさんの説明ありがとうございます。

> 開発者(プログラマー)を指しているのであれば、その認識で OK かと思います。
その認識です、ありがとうございます。

> Visual Studio は全く関係ありません。
そもそも、Visual Studio 無しでもコーディングやコンパイルは可能ですし。
申し訳ないです、IT知識が少なく、例にあげてくれたこれらの総称をうまく言語化出来ませんでした。

> (1) Visual Studio やそのアドインによって提供される機能
> (2) C# や C などの言語(あるいはそのコンパイラ)によって齎せられる機能
> (3) .NET / .NET Framework といったフレームワーク、あるいは NuGet や参照設定で使えるライブラリで提供される機能

> int ballX, ballY が、スカラ値であるボール座標情報、
> int ballVelocityX, ballVelocityY が、ベクトル値であるボール移動量情報。
例にあげてくれた(1)、(2)、(3)によって、スカラ値の役割である int ballX, ballY が存在というか、それ専用の使いやすくするための特別な仕様が用意されているのではなく、これはプログラマーが数学的な概念を int ballX, ballY に、当てはめて利用してるだけと言いたかったんです。

まだうまく言語化できませんが頭の中でようやく理解できてきました。

ここのサイトの跳ね返るボールのサンプルなどを参考に色々弄ってて、次に他サイトのブロック崩しのサンプルを弄ろうとしたら、
今まで触れていなかったものが一気にきて、分からないことが分からない状態になり色々なんだか混乱しましたが、
解説してくださったおかげで分かってきました。
vector は、今のところは Point で何とかなりますし vector を使わないと困るとは感じないのでこのままでいこうと思います。
一応、vector と高校数学みたいな難しいものを使わずブロック崩しを再現できたので、これでいいかなと思ってます。

ネットに情報は転がっているとはいえ、C#という括りで更に特定条件での質問・・・C#+vectorの組み合わせなんかになると、なかなか探し出せなくなり、質問できる場所もあれどサイトが機能してない、過疎などで返ってくることは少ないので、このようにお返事をくれてがっつり解説してくださることは本当にありがたいことです、ありがとうございます。
私の知識のなさと、もしかしたら配慮に欠ける発言があり、不快になられたら申し訳ないですがとてつもなく助かりました。本当に。
今回の質問はこれで終わろうと思います、ありがとうございました。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/10/6 11:59:20
> visual studio的に変位値という機能を持っていてその概念がvisual studioに存在するという説明ですか?
いえ。Visual Studio は一切関係がありません。

.NET や .NET Framework で提供される構造体である「Point 型」と「Vector 型」の違いが
分からないとの質問だったので、その違いが見えるよう、具体的な事例を挙げただけです。


今回の議題は、「位置」を扱う Point 型と「変位」を扱う Vector 型であり、型としては
物理学や線形代数学的でいうところの「スカラー値とベクトル値」の概念を適用できます。

先の Point + Vector による演算関係は、
「時刻」を扱う DateTime 型と
「時間」を扱う TimeSpan 型の関係にも似ています。

DateTime 型は、「今日」「明日」「2023/12/31 12:34:56.789」といった、ある瞬間の日時を指す構造体です。
TimeSpan 型は、「3 日前」「半日後」「12時間」といった、時間間隔を指す構造体です。

DateTime + TimeSpan の結果は DateTime です。たとえば「今現在の8時間後」の DateTime を求められます。
DateTime - DateTime の結果は TimeSpan です。たとえば「今日の正午」から「今日の正子」を引くと「12時間」と算出されます。
TimeSpan + TimeSpan や TimeSpan - TimeSpan の結果は TimeSpan です。たとえば30分間+45分間は「1.25時間」です。

でも、DateTime + DateTime はできません。
今日の日付と自身の誕生日を加算したりはできませんものね。


> それとも動画のように元々あるvisual studioの機能を数学に当てはめた数学的な説明ですか?
「visual studioの機能」という表現だと語弊がありますが…そもそもプログラミングとは、
現実世界の出来事やデータを、クラスや構造体などを使って表現していく作業です。

そのために使える型が、.NET や .NET Framework には、標準で沢山備わっている、ということです。

しかしそうしたクラスや構造体を使わずともプログラミングはできます。
位置情報、変位値、時刻、時間などなど、専用の型を使わず、int や double で表現することはできます。

同じ機能を自分で作りこんでいくことになれば、その分、手間はかかりますが、
実際、ベクトル情報が汎用的なタプル型や配列で管理されるケースは少なからずあります。
開発環境のバージョンが古いと使えない型などもありますからね。

先人が用意した出来合いの機能を使えるなら、それらを使う方が簡単ではありますが、その数は膨大であり
すべてを網羅することも当然できません。それらを学ぶ労力をどこまで割けるのかは本人次第・状況次第。

今は良く分らない機能でも、サンプルを数多く真似し続けていくことで、突然理解できるようになる瞬間があります。
知らない機能や使いこなすのが難しい機能だと、そもそもサンプルを真似ることさえできないケースがあるでしょう。

それでもある程度の基礎学力が付いていれば、別にそれらを用いずにアルゴリズムから組んでいくことだって
できるでしょう。ただしそのためには、そのプログラムに求められる要件や仕組みを、正しく理解していることが
大前提です。(概要を正しく理解していなければ、便利なライブラリやクラスを検索することもままならないかも…)

そういうわけで、当初の質問である
>> このVector型とやらは今後、頻繁に使うことになりますか?
についていえば、先に述べた通り、
>>> 専用の型がある場合、それを使うことで効率よく書ける場面があるのは確かです
とか
>>> 習得する意義があるかどうかは、プログラミングの目的や要件、そして自身の理解度次第
という曖昧な回答になってしまいました。
しょっちゅう使う人も居れば、全く使わない人も居るでしょうね。


> 使う側が理屈、概念を当てはめているだけなのでしょうか?。
まぁそうですね。

こうした当てはめは、Vector や Point に限らず、すべてのデータ型で通ずることですが、
あらゆるクラスや構造体は、現実世界の何らかのモノを抽象化したものと言えます。

たとえば、イチローや大谷翔平という object は「人間」や「選手」といった概念に抽象化できます。
生年月日を記録するソフトを作っているのなら、Person クラスを自作して、
 var p1 = new Person("鈴木 一朗", new DateTime(1973, 10, 22));
 var p2 = new Person("大谷 翔平", new DateTime(1994, 7, 5));
 list.Add(p1);
 list.Add(p2);
などと書くかも知れません。野球ゲームを作っているなら、Player クラスを自作して、
彼らの能力を数値パラメーターとして、Player クラスのプロパティに当てはめていくかもしれません。

Person や Player といった型は「抽象的」なものであり、その型にどういう意味を持たせるかは、
データ型の設計者と、その型を使う開発者の手に委ねられます。

名前や誕生日や打率といったデータは、突き止めれば「文字列」や「数値」に過ぎないので、
専用のクラスを用意せず、個別の変数や配列で管理することもできます。

とはいえ、別々の変数で管理されていると管理しにくいので、関連した情報を
「クラス」や「構造体」といった単位で管理すると便利です。そしてよく利用される概念については、
それらはフレームワークによって「標準的なデータ型」としてあらかじめ用意されることになります。

まぁ、そういった抽象的な話は、恐らく既に御存知であろうとは思いますが、
> これらを区別して整理して理解したかったんですが、
私自身、長年の経験則で習得したクチなので、他者に説明するのは難しいです…。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/10/6 11:43:03
> これはソフトウェア的には(visual studio?)
映像を見る限りでは、Visual Studio 2019 ですね。

> ですが、visual studioを使う側がボールの座標、ボールの移動量としてint型の変数をうまく扱っているだけで
ここでいう「visual studioを使う側」というのが、
開発者(プログラマー)を指しているのであれば、その認識で OK かと思います。

Visual Studio が int 型を扱っている、という認識だと用語的には NG ですが。


> visual studio側が特別な仕様や概念が用意されるわけではないんですね。
Visual Studio は全く関係ありません。
そもそも、Visual Studio 無しでもコーディングやコンパイルは可能ですし。

コーディング時に使われる機能を大別化すると、たとえばこのように分類できます。

(1) Visual Studio やそのアドインによって提供される機能
(2) C# や C などの言語(あるいはそのコンパイラ)によって齎せられる機能
(3) .NET / .NET Framework といったフレームワーク、あるいは NuGet や参照設定で使えるライブラリで提供される機能

---
1 の例:ステップ実行、入力支援機能(IntelliSense)、CodeLense など
2 の例:int 型、UTF-8 リテラル、タプル要素名推論 など
3 の例:System.Int32 構造体、Point 構造体、Vector 構造体など

※機能によっては、2 + 3 の組み合わせで提供されるものなどもあります。


> var v = new System.Windows.Vector(100d, -173d); の、100dがなぜ右向きに 30 の大きさになるのか、
うゎぁ…ごめんなさい修正漏れです! (ホント深夜に投稿するもんじゃないですね…)

右向きに 100 の間違いです。本当に混乱させてすみません。
【右向きに 100、上向きに 173 のベクトル】です。


v = Vector(100, -173) の場合、v.X の値は 100 になり、v.Y が -173 になるわけですが、
三角比の定義により、「30°、60°、90°」の直角三角形の 3 辺の比は「1:2:√3」です。
つまり「水平に 100.000:垂直に173.205」な三角形は、斜辺の長さが 200.000、その角度が 60°と定まります。

角度については、逆三角関数 arctangent で求められますね。
Excel で「=DEGREES(ATAN(-173/100))」と計算させることで、約 -59.9706 という角度を得られます。
演算結果がマイナスの値になるのは、数学で扱う「右手座標系」と、グラフィックで扱う「左手座標系」とで、
Y 軸の正負の向きが逆であることが原因です。

数学で使うグラフは通常、左下を原点座標 (0, 0) とし、右方向が +X、上方向が +Y として図示される座標系ですが、
グラフィック処理(印刷処理なども)では左上を原点とします。右方向が +X、上方向が -Y、下方向が +Y です。


> なぜ全ての数値に「d」が付いてるのか分かりませんでした。
数値の末尾につく d または D とは、「double 型のリテラルであることを示す接尾辞(サフィックス)」です。
たとえばこのような接尾辞があります。


var v1 = 100;   // これは int 型
var v2 = 10.0;  // これは double 型
var v3 = 10D;   // これも double 型
var v4 = 10F;   // これは float 型
var v5 = 10M;   // これは decimal 型
var v6 = 10L;   // これは long 型
var v7 = 10UL;  // これは ulong 型
var v8 = 10U;   // これは uint 型
var v9 = 10UL;  // これは ulong 型



接尾辞では、大文字小文字が区別されません。
たとえば、ulong 型の接尾辞は UL、Ul、uL、ul、LU、Lu、lU、lu のいずれでも構いません。

System.Windows.Vector 構造体のコンストラクターが、引数として「2 つの double 値」を要求するので、
先の例では d を明示しました。先の例では、int を渡しても、自動的に double に変換されるので
d を付けなくても同じ結果を得られますが、オーバーロードを持つメソッドを使う場合は、
引数の型によって振る舞いが変わることがあるので、データ型は大事です。

型繋がりの蛇足情報ですが、decimal 型においては小数部の桁数も保持されます。

 decimal x = 100.00M;
 decimal y = 100.0000M;
 bool z = (x == y); // これは true として扱われるが…
 string X = x.ToString(); // これは "100.00"
 string Y = y.ToString(); // これは "100.0000"


また、「負のゼロ」という概念もあります。

 double x = 0.0;
 double y = -0.0;
 bool z = (x == y); // これは true として扱われるが…
 string X = 1.0 / x; // これは "∞"
 string Y = 1.0 / y; // これは "-∞"
投稿者 祈り星  (社会人) 投稿日時 2023/10/5 23:33:32
遅くまで解説ありがとうございます。

> int ballX, ballY が、スカラ値であるボール座標情報、
> int ballVelocityX, ballVelocityY が、ベクトル値であるボール移動量情報。
なるほど、この動画でこれはソフトウェア的には(visual studio?)int型の変数であり、ただの入れ物。
ですが、visual studioを使う側がボールの座標、ボールの移動量としてint型の変数をうまく扱っているだけでvisual studio側が特別な仕様や概念が用意されるわけではないんですね。


> それでは、座標値と変位値が別の概念であることを示すため、変位の実装例を挙げてみましょうか。
var v = new System.Windows.Vector(100d, -173d); の、100dがなぜ右向きに 30 の大きさになるのか、
なぜ全ての数値に「d」が付いてるのか分かりませんでした。
あと、書いてくれた説明はvisual studio的に変位値という機能を持っていてその概念がvisual studioに存在するという説明ですか?
それとも動画のように元々あるvisual studioの機能を数学に当てはめた数学的な説明ですか?

Vector は Point と似てて、座標を表す仕様ですが計算が出来る所が違ったりするだけで使う側が理屈、概念を当てはめているだけなのでしょうか?。
少なくとも数ある Vector のうちの System.Windows.Vector という物に関しては。
あとはWPFとやらを使わない限りは?

数学的なものと、
ソフトウェアに元々用意された仕様と、
使う側が数学的なものをソフトウェアの機能に意図しない色々なやり方で当てはめてくパターン、
これらを区別して整理して理解したかったんですが、うまく言語化もできず混乱して分かりずらくて申し訳ないです。
難しいですね・・・。

WPF は知りませんでした、元々あるツールボックスのUI?なんかを自分で作れる何か、程度の認識です。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/10/5 10:29:33
> Point p1; を座標値、Point p2; を変位値として扱うことにすれば、上記と同様の演算を
>  Point p0 = p1.Offset(p1.X, p2.Y);
> などという代用コードで済ますことが可能ではあります。

おっと書き間違い…深夜投稿のせいもあって、見直しが足りていませんでした。

Point p0 = p1.Offset(p2.X, p2.Y);

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/10/5 02:17:53
>> 高校数学Bの『ベクトル』
失礼しました。現在の学習指導要領までは確認していなかったのですが、検索してみたところ、
どうやら平成30年改訂にて、数学B から数学C に移行したという話が見つかりました。
『行列』の単元なども、年度や学校によってはまったく習わないことがあると聞いて驚いてます…。


> System.Windows.Vector の使い方がPoint型とあまりに似すぎて同じ印象という認識です。
その認識で OK です。
それぞれをどう扱うかはプログラマ次第ですし、現時点では必ずしも厳密にとらえる必要は無いでしょう。
実際のところ、Vector3 構造体を 3 次元座標情報として使用するケースもありますし、
その逆に Point 構造体を座標としてではなく、移動量として用いる場合もあります。

下記は C# ではなく C におけるコンソールアプリなブロック崩しですが、
このぐらいであれば、int だけでも十分に管理できますね。

int ballX, ballY が、スカラ値であるボール座標情報、
int ballVelocityX, ballVelocityY が、ベクトル値であるボール移動量情報。
https://youtu.be/1dfOCNQyYqg?t=840


> やはり座標以外の役割を持った値・・・変位だとかの値を表しているのでしょうか?
それでは、座標値と変位値が別の概念であることを示すため、変位の実装例を挙げてみましょうか。

var p = new System.Windows.Point(100d, 200d); は、「X = 100, Y = 200」の座標として使うことができます。
var v = new System.Windows.Vector(100d, -173d); なら、「右向きに 30 の大きさ、上向きに -173 の大きさ」と言えます。

単純な等速直接運動を考えた場合、この二つを組み合わせることで、
(100, 200) の座標にあったボールを右上方向約 60°の角度で移動させる様子を表すことができます。
この時のボールの移動速度は、約 200 ですね。…… Math.Sqrt(v.X * v.X + v.Y * v.Y)

移動後のボール座標を得たい場合、単に var o = p + v; とするだけで、
座標値 new Point(200d, 27d) が得られます。
これが可能な理由は Point + Vector や Vector + Point の演算を、Point 型の結果で得られるよう、
これらの型で「+ 演算子」がオーバーロードされているためです。
ちなみに、Point - Point の演算では、2 点間の変位量を Vector 型で得ることができます。

ただし、これが Point + Point という演算になるとコンパイルエラーとなります。
概念的に、座標同士の加算という行為には意味が無いため、Point 型同士の加算はできないからですね。。
(🗼東京タワーの緯度経度と、🗽自由の女神の緯度経度を足し合わせる…なんてことは無意味なわけで)

とはいえVector 型を使わなかったとしても、たとえば
Point p1; を座標値、Point p2; を変位値として扱うことにすれば、上記と同様の演算を
 Point p0 = p1.Offset(p1.X, p2.Y);
などという代用コードで済ますことが可能ではあります。
Offset メソッドは、System.Windows.Point にも System.Drawing.Point にも存在します。


> System.Windows.Vector は、C#においてどのような具体的な使い方をするのでしょうか?
WinForms で主要な名前空間は、System.Windows.Forms 名前空間と、System.Drawing 名前空間です。
.NET で使う場合は <UseWindowsForms>true</UseWindowsForms>、.NET Framework では System.Drawing.dll アセンブリ。
System.Drawing 名前空間は、主に「GDI+」系のグラフィック処理で使われます。

WPF における主要な名前空間としては、System.Windows 名前空間と System.Windows.Media 名前空間があります。
.NET では <UseWPF>true</UseWPF> ですね。.NET Framework では WindowBase.dll アセンブリ。


ということで、System.Windows.Vector は本来は WPF 向けであり、
通常は、WinForms からはさほど使われていなかったりします。


> System.Windows.Point 構造体 と
> System.Drawing.Point 構造体 では、何が違うんでしょうか?
ターゲットとしている UI 層が異なるだけで、機能的にはほぼ同じです。
名前空間ごとに似たようなクラスや構造体があるので、ややこしいですよね…。


System.Windows.Point 構造体は通常、WPF にて使われます。それに対して、
WinForms での座標では一般的に、GDI+ 用である System.Drawing.Point / PointF 構造体が使われます。
この他には Windows API で使われる、GDI 用の POINT 構造体などもあります。
https://learn.microsoft.com/ja-jp/windows/win32/api/windef/ns-windef-point


具体例としては:

WPF における MouseLeftButtonDown イベントの e.GetPosition メソッドで
得られる Point 型は System.Winodows.Point 構造体です。

WinForms における MouseClick イベントの e.Location プロパティで
得られる Point 型は、System.Drawing.Point 構造体です。

Win32 API の GetCursorPos 関数で得られる座標情報は POINT 構造体です。



その他の名前空間として、.NET では「System.Numerics 名前空間」が良く使われます。
(NuGet にある System.Numerics.Vectors によって提供されます)
こちらは比較的汎用的な実装になっているので、要件によっては使いやすいかも知れません。

この名前空間には、float なベクトル管理のための Vector2, Vector3, Vector4 構造体や、
行列演算のための System.Numerics.Matrix3x2 や System.Numerics.Matrix4x4 があります。
クォータニオン(3次元の物理回転)のための System.Numerics.Quaternion 構造体や
ジェネリックな Vector<T> 構造体もあります


この他、特定 CPU の専用命令を使って高速処理されるために用意された
「System.Runtime.Intrinsics 名前空間」の下にも、並列処理に向いた
Vector64<T>, Vector128<T>, Vector256<T> 構造体といったものが用意されています。


行列演算については、WPF なら一応 System.Windows.Media.Matrix 構造体などもありますし、
GDI+ 版なら、System.Drawing.Drawing2d.Matrix があります。
https://learn.microsoft.com/ja-jp/dotnet/api/system.drawing.drawing2d.matrix
https://learn.microsoft.com/ja-jp/dotnet/desktop/wpf/graphics-multimedia/how-to-transform-points-and-vectors

行列演算は、色変換などでも使われますね。GDI+ の ColorMatrix クラスとか。
https://dobon.net/vb/dotnet/graphics/saturation.html
https://dobon.net/vb/dotnet/graphics/colorbalance.html
投稿者 祈り星  (社会人) 投稿日時 2023/10/4 21:12:11
解説ありがとうございます。
分からないことが多すぎて全てがごちゃごちゃの考えになり混乱してましたが詳しい説明のおかげで少し整理ができて、何が分からないのかが分かりました。

ブロック崩しのコードの難しい計算式は高校数学の問題であり、今回知りたいプログラミング関係とは少し離れてしまうことが分かったので、おまじないと化してしまいますが置いときます。

数学においてのベクトルは何となく分かりました。
では今回のブロック崩しで使われている System.Windows.Vector は、C#においてどのような具体的な使い方をするのでしょうか?
変位と書かれましたが、Point型と同じような座標を表す使い方をブロック崩しのコードではされていたので、理屈は分かっても実際の System.Windows.Vector の使い方がPoint型とあまりに似すぎて同じ印象という認識です。

this.ballPos = new Vector( 200, 200 );
みたいな宣言も第一引数、第二引数はx座標とy座標になりますよね、その位置に描画してれば現れますし。
やはり座標以外の役割を持った値・・・変位だとかの値を表しているのでしょうか?
勉強不足と理解力が足りないのですかね、せっかく説明されたのに繰り返すような質問で申し訳ないです。

あと今更の質問ですが、
System.Windows.Point 構造体 と
System.Drawing.Point 構造体 では、何が違うんでしょうか?

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/10/4 11:02:08
> Vector型がどういう時に使うのか、どういう物なのか正直全く分からず、
ざっくり言えば「ベクトル値を保持し、計算に使うための型」ですね。
高校数学Bの『ベクトル』(分野によってはベクターとも呼ばれる)のこと。

グラフィック系を扱っていると、三角関数であるとか、行列演算であるとか、複素数といった数学用語が出てくることもありますが、
ベクトルという用語も、そんな中の一つに過ぎません。小難しい話は高校の教科書にでもお任せするとしましょう。

実際のところ、一口に「ベクトルを表す型」といっても、世の中には様々なVector系構造体の C# 実装があります。
3D 系の場合、OpenTK を使っているならば System.Numerics.Vector3 ではなく OpenTK.Vector3 が
使われていたりしますし、WPF ならば  System.Windows.Media.Media3D.Vector3D が利用されます。
3 次元物理回転をエンコードするために使用されるベクトルを表す System.Numerics.Quaternion 構造体などもあります。

とはいえいずれも、ベクトル値を管理するという主目的は同じです。

数学的には、ベクトルとは「方向と大きさ」のように、互いに独立な複数の異なる値の組み合わせとして表される量のこと。
たとえば質量や温度といったデータは、大きさはありますが向きはありません(スカラー値)。
速度や力といったデータは、大きさだけでなく向きも含んでいます(ベクトル値)。
物理学や自然科学においては、回転変換に対する変換性によって特徴付けられる量をベクトル量と呼びますし
分野によって多少意味合いが異なることがありますが、まぁ根っこは同じです。

ML なんかで出てくるテンソル(Tensor)は、これらをさらに一般化したもので。
スカラー値(質量や温度など)は階数 0 のテンソル、
ベクトル値(力や運動量など)は階数 1 のテンソル、
行列(力や加速度ベクトルの異方的な線型変換)では階数 2 のテンソル

…閑話休題。

System.Windows.Vector では、2 つの double 値(X プロパティと Y プロパティ)を管理しています。
System.Windows.Media.Media3D.Point3D では、3 つの double 値(X、Y、Z プロパティ)を管理しています。
System.Numerics.Vector2 では、2 つの float 値(X プロパティと Y プロパティ)を管理しています。
System.Numerics.Vector3 では、3 つの float 値(X、Y、Z プロパティ)を管理しています。
System.Numerics.Vector4 では、4 つの float 値(X、Y、Z、W プロパティ)を管理しています。

このほかにも色々あるのですが、それはひとまず置いといて。

2 つの値、3 つの値を保持しているという点だけ見ると、
System.Drawing.PointF 構造体や System.Windows.Media.Media3D.Point3D 構造体に似ていますが、
Point、PointF、Point3D といったものが「座標位置」を表しているに対し、
Vector 系の方は「変位」を表すための型という違いがあります。
たとえば、PointF は PointF 同士の加算や減算をサポートしますが、
Vector2 型であれば、ベクトル値とスカラ値の乗除算や行列演算なども効率よく行えます。

とはいえ、これら Vector 系の型を使わずに実装することもできますので、言語習得に必須というほどではないです。

組となる複数の値を保持する、と要件だけ見れば、n 次元の配列を使って管理したり、
Tuple クラス / ValueTuple 構造体による所謂 `n-Tuple` で表現することもできるので
Vector クラス / Vector<T> 構造体を知らなくてもコーディングできなくはないです。

スカラー値や 0 軸テンソルとなら int や float、
ベクトル値や 1 軸テンソルなら、int[] や float[] などの 1 次元配列や List<T> など、
2 軸テンソルなら、3 次元配列などといった具合に。

とはいえ、専用の型がある場合、それを使うことで効率よく書ける場面があるのは確かですし、
習得する意義があるかどうかは、プログラミングの目的や要件、そして自身の理解度次第ですね。
投稿者 祈り星  (社会人) 投稿日時 2023/10/3 21:14:36
追加のお答えありがとうございます。
その、Vector型がどういう時に使うのか、どういう物なのか正直全く分からず、自分で何らかの法則性を導きだそうとしましたが難しいですね。
C#のVector型の解説サイトも見つけられず、unityが絡まない日本語のいいサイトがもしあれば教えてほしいです。
参考にしてるブロック崩しのパドルとボールの当たり判定の計算で高校数学レベルの物も必要だと書いてあり、それも合わさって難しい。
幸いこれは勉強ができるサイトがあるので見ていますが、どこで必要なのかもよく分からず、たどり着くまで時間がかかり難しいですね。
コピペでもいいですが、それで終えても別の何かにコピペですら生かすこともできなさそうで厳しいですが、今後作りたい物にこれらの知識が必要であると判断すれば、頑張って勉強していきたいです。

Point型は名前空間までちゃんと書いたら使えました、ありがとうございます。

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/10/2 23:00:09
> ただ、これをするとPoint型が使えなくなりましたがこういう物なのかな・・・?

System.Windows.Point 構造体 と
System.Drawing.Point 構造体 とで
型名が競合してしまったのが原因です。

どちらを指しているのかを区別できるよう、名前空間を明示して書くようにすれば、コンパイルエラー (CS0104) を回避できます。

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/10/2 22:51:15
> このVector型とやらは今後、頻繁に使うことになりますか?
一口に Vector型 といっても色々あるわけで。

今回利用したのは System.Windows.Vector 構造体ですが、他にも
System.Numerics.Vector クラスとか
System.Numerics.Vector<T> 構造体とか。

https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.vector?view=windowsdesktop-7.0
https://learn.microsoft.com/ja-jp/dotnet/api/system.numerics.vector?view=net-7.0&viewFallbackFrom=windowsdesktop-7.0
https://learn.microsoft.com/ja-jp/dotnet/api/system.numerics.vector-1?view=net-7.0


> Vector型は難しそうでほぼ使うことがないのならスルーでいいかなと思っているんですが・・・。
単にベクトル演算のための値を保持したいというだけであれば、WPF 版ではなく Vector<T> の方が良い気もしますね。ハードウェアアクセラレーション (SIMD ベクトル化機能)が効くようなので。
https://ja.wikipedia.org/wiki/SIMD
https://monobook.org/wiki/System.Numerics.Vector%EF%BC%9CT%EF%BC%9E
https://qiita.com/radian-jp/items/186862f355ac5625a704
https://gogowaten.hatenablog.com/entry/2020/02/11/153010
投稿者 祈り星  (社会人) 投稿日時 2023/10/2 22:37:02
回答ありがとうございます。
プロジェクトでいいのかな?そこに書いたら無事にできました。
ただ、これをするとPoint型が使えなくなりましたがこういう物なのかな・・・?

しかし無事に解決できました、本当にありがとうございました。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/10/2 22:05:13
ソリューション エクスプローラーから WinFormsApp1 を開き、
.csproj の内容を下記のように書き換えてみてください。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net6.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
 
    <UseWindowsForms>true</UseWindowsForms>
    <UseWPF>true</UseWPF>
 
   <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>
</Project>
https://learn.microsoft.com/ja-jp/dotnet/core/project-sdk/msbuild-props-desktop
投稿者 祈り星  (社会人) 投稿日時 2023/10/2 18:41:09
C#初心者でC#のプログラミング言語しか分かりませんが質問させてください。
OSはWindows10で visual studio community 2022 を使っています。

このサイトを参考にブロック崩しを作ろうとしました。
https://nn-hokuson.hatenablog.com/entry/2017/08/17/200918

しかし、Vector型が使えるようにするにはWindowBaseフレームワークの参照を追加する必要がある、と書かれていたので書いてある通りにソリューションエクスプローラーのプロジェクトから右クリックで参照を押そうとしたら存在しませんでした。
どうやら選択したフレームワークの.NET6には存在しないみたいで代わりに、NuGetパッケージの管理でダウンロードするみたいなのですが、WindowBase となる物の名称が分かりません。
どれを選択すれば WindowBaseをダウンロードできるのでしょうか?
目的はVector型を使えるようになることです。

あと、もう一つ質問させてください。
このVector型とやらは今後、頻繁に使うことになりますか?
私はSTG、シミュレーション、RPG等の色々なゲームを作りたいと思っているのですが、Vector型は難しそうでほぼ使うことがないのならスルーでいいかなと思っているんですが・・・。
よろしくお願いします。