投稿者 魔界の仮面弁士  (社会人) 投稿日時 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 といった型は「抽象的」なものであり、その型にどういう意味を持たせるかは、
データ型の設計者と、その型を使う開発者の手に委ねられます。

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

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

まぁ、そういった抽象的な話は、恐らく既に御存知であろうとは思いますが、
> これらを区別して整理して理解したかったんですが、
私自身、長年の経験則で習得したクチなので、他者に説明するのは難しいです…。