なぜかC#になったスキルシート

[id:tsugehara:20070223:1172216368]で触れて依頼すっかりご無沙汰だったSkillsheetだが、いつの間にかC#になっていた。
しかもManaged DirectXを使ってグラフを描画していたりする。
事の経緯は諸事情により割愛するが、進捗は60%くらい。
100%になったらちゃんと書く・・かも。


グラフ本体描画はベトナム人エンジニアに任せて、彼の担当分は終了。一クラスに全部突っ込んでいたのを一時間ほどのペアプロ(といっても私の作業を横で見てもらうだけ)でリファクタしたりはしたが、基本的な描画部は頑張って作っていた。
さて、今日はその彼のプログラムを改修しつつ、私担当分をちょっと作業する。

彼のコード

少しだけソースコードをさらしておく。

namespace com.cuvel.metis.graphs
{
    public class RaderChart: CommonDrawer
    {
// 〜中略〜
        public override void draw()
        {
            if (m_device == null) return;

            int[] x = new int[m_graphData.Count];
            int[] y = new int[m_graphData.Count];
            float beta = (-PI / 2);

            int[] x2 = new int[m_graphData.Count];
            int[] y2 = new int[m_graphData.Count];

            for (int i = 0; i < m_graphData.Count; i++)
            {
                x[i] = (int)((m_graphData[i].SkillLevel * r / 5) * System.Math.Cos(beta) + xc);
                y[i] = (int)((m_graphData[i].SkillLevel * r / 5) * System.Math.Sin(beta) + yc);
                x2[i] = (int)((m_graphData[i].SkillVolition * r / 5) * System.Math.Cos(beta) + xc);
                y2[i] = (int)((m_graphData[i].SkillVolition * r / 5) * System.Math.Sin(beta) + yc);
                beta += 2 * PI / m_graphData.Count;
            }

            for (int i = 1; i <= 5; i++)
                drawPolygonal((float)(i * r / 5));

            for (int i = 0; i < m_graphData.Count - 1; i++)
            {
                fillSkillLevel(xc, yc, x[i], y[i], x[i + 1], y[i + 1]);
                fillSkillVolition(xc, yc, x2[i], y2[i], x2[i + 1], y2[i + 1]);
            }

            fillSkillLevel(xc, yc, x[m_graphData.Count - 1], y[m_graphData.Count - 1], x[0], y[0]);
            fillSkillVolition(xc, yc, x2[m_graphData.Count - 1], y2[m_graphData.Count - 1], x2[0], y2[0]);

            LinePolygonal();
            DrawSkillName();
        }
    }

    public abstract class CommonDrawer : IGraphDrawer
    {
        protected Microsoft.DirectX.Direct3D.Device m_device;
        protected MetisCollection m_graphData = new MetisCollection();
// 〜 中略 〜
        public abstract void draw();
        public void setData(MetisCollection data) {
            this.m_graphData = data;
        }
        public MetisCollection getData() {
            return this.m_graphData;
        }
        public void attachDevice(Microsoft.DirectX.Direct3D.Device device) {
// 〜 後略 〜
    }

    public partial class MetisGraph : System.Windows.Forms.UserControl,metis.IMetisGraph
    {
        private IGraphDrawer m_drawer = null;
// 〜 後略 〜

クラス構成は先に触れたリファクタ作業で私が適当にやったが、中身は彼が全部作った。
この他、棒グラフを描画するクラス(CommonDrawerを継承)がいる。
なんか今適当に抽出したコードだけをぱっと見てもr/5という不思議さんがたくさんいるな。5段階評価のレーダーチャートの各半径算出用だと思うが。
(-PI / 2)なんてのもC#ならいらないんじゃないか?Cと同じで360度駄目なんだっけ?
まあ、じっくり見てみよう。
パフォーマンス最適化や10段階評価対応などは後回しで、まずはメモリリークする箇所がないかのチェックから始めるかな。

ベトナム人との共同戦線

今回はベトナム人との共同戦線の中ではまずまず上手くいった方。
C#プログラマとしてもOOPプログラマとしても経験の足りない彼が、いきなりDirectXでレーダーチャートを描画出来たのは、数学の知識については問題なく、またその数学力を基盤にアルゴリズムの構築能力についてもいいものを持っているという事だと思われる。
また、DirectXが組めたのはサンプルを探し出す能力や、未知の分野についての意欲があるからで、1985年生まれの人間がこういうコードを1週間程で作ってくれたのは、将来に期待出来るという事だろう。
細部は粗いかもしれんが、潜在能力としては悪くない。
後はこの「細部は粗い」を、なんとかすることが出来れば・・。