dodanie napisow(oznaczen) na trojkacie sierpinskiego

0

witam

napisalem program w c++/opengl ktory rysuje trojkat sierpinskiego (o podanym levelu/stopniu)
po skompilowaniu wyglada to w sumie tak (to oczywiscie 6 osobnych zrzutow programu):
http://www.cplusplus.com/articles/LyTbqMoL/serpinskiTriangles.jpg
mamy tam zwykly trojkat, ktory po zwiekszeniu zmiennej dzieli kazdy bok i tworzy kolejne trojkaty, potem kolejny i kolejny - wiadomo jak jest budowany trojkat sierpinskiego

dobrze by bylo gdybym na kazdym trojkacie czarnym ktory sie pojawi (w zaleznosci od tego jak bardzo 'zaawansowany' trojkat bede chcial narysowac), bylby on oznaczony jakims napisem - ponumerowanym albo jakkolwiek. jest mi to porzebne do rozwiazania pewnego problemu

ktos ma pomysl jak moglbym naniesc jakikolwiek napis na kazdy z czarnych trojkatow?

//ewentualnie jesli jest to jakos zbyt trudne to moze latwiej byloby opisac wierzcholki, jesli nie bylby to taki idealny trojkat tylko cos takiego
http://www.cut-the-knot.org/triangle/hanoi3.gif
gdzie w srodku nie jest juz wyciety trojkat ale jakis szesciokat

0

Program jest napisany w C#.
Program do rysowania trojkata Sierpinskiego z tej strony: http://csharphelper.com/blog/2015/01/draw-sierpinski-triangle-c/

Zmodyfikowany kod:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Drawing.Drawing2D;

namespace howto_sierpinski_triangle
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private int Level = 3;
        private int i = 1;

        private void Form1_Load(object sender, EventArgs e)
        {
            DrawGasket();
        }
        private void btnDraw_Click(object sender, EventArgs e)
        {
            DrawGasket();
        }
        private void Form1_Resize(object sender, EventArgs e)
        {
            DrawGasket();
        }

        // Draw the triangle.
        private void DrawGasket()
        {
            Level = int.Parse(txtLevel.Text);
            i = 1;

            Bitmap bm = new Bitmap(
                picGasket.ClientSize.Width,
                picGasket.ClientSize.Height);
            using (Graphics gr = Graphics.FromImage(bm))
            {
                gr.Clear(Color.White);
                gr.SmoothingMode = SmoothingMode.AntiAlias;

                // Draw the top-level triangle.
                const float margin = 10;
                PointF top_point = new PointF(
                    picGasket.ClientSize.Width / 2f,
                    margin);
                PointF left_point = new PointF(
                    margin,
                    picGasket.ClientSize.Height - margin);
                PointF right_point = new PointF(
                    picGasket.ClientRectangle.Right - margin,
                    picGasket.ClientRectangle.Bottom - margin);
                DrawTriangle(gr, Level, top_point, left_point, right_point);
               
            }

            // Display the result.
            picGasket.Image = bm;

            // Save the bitmap into a file.
            bm.Save("Triangle " + Level + ".bmp");
        }

        // Draw a triangle between the points.
        private void DrawTriangle(Graphics gr, int level,
            PointF top_point, PointF left_point, PointF right_point)
        {
            // See if we should stop.
            if (level == 0)
            {
                // Fill the triangle.
                PointF[] points =
                {
                    top_point, right_point, left_point
                };
                gr.FillPolygon(Brushes.Red, points);

                Font drawFont = new Font("Arial", 12);
                SolidBrush drawBrush = new SolidBrush(Color.Black);
                SizeF stringSize = new SizeF();
                stringSize = gr.MeasureString(i.ToString(), drawFont);
                PointF drawPoint = new PointF(top_point.X - (stringSize.Width / 2), (top_point.Y + right_point.Y) / 2);
                gr.DrawString(i.ToString(),drawFont,drawBrush,drawPoint);
                i++;

            }
            else
            {
                // Find the edge midpoints.
                PointF left_mid = new PointF(
                    (top_point.X + left_point.X) / 2f,
                    (top_point.Y + left_point.Y) / 2f);
                PointF right_mid = new PointF(
                    (top_point.X + right_point.X) / 2f,
                    (top_point.Y + right_point.Y) / 2f);
                PointF bottom_mid = new PointF(
                    (left_point.X + right_point.X) / 2f,
                    (left_point.Y + right_point.Y) / 2f);

                // Recursively draw smaller triangles.
                DrawTriangle(gr, level - 1, top_point, left_mid, right_mid);
                DrawTriangle(gr, level - 1, left_mid, left_point, bottom_mid);
                DrawTriangle(gr, level - 1, right_mid, bottom_mid, right_point);
            }
        }
    }
}

efekt na dołączonym obrazku ;)

0

Nie programuje w C++ ale mysle ze mozesz to przepisac na C++.

0

bylbys w stanie dokonac pewnych modyfikacji w tym kodzie (chocby odplatnie?) chodzi oczywiscie o c# i tylko o to ten tekst (tutaj numerowanie ale mam zrobic to troszke inaczej)

0

Sorki ale mam wlasne projekty do zrealizowania.
Jesli chcesz to dodaj watek na "Ogłoszenia drobne" a ktos na pewno sie odezwie.

Powodzenia

1 użytkowników online, w tym zalogowanych: 0, gości: 1