/*
            __
           / /_______________  ____  ___
          / __/ ___/ ___/ __ \/ __ \/ _ \
         / /_(__  ) /__/ /_/ / /_/ /  __/
         \__/____/\___/\____/ .___/\___/
                           /_/
    
    coordinate system and helper functions

    By Michael Stevens

    See license.html for copyright information
*/

#include "../include/tscope.h"
#include "../include/tscope/internal.h"


// set coordinatesystem
int ts_coordinates(int system)
{
    if (system != CARTESIAN && system != STANDARD)
        ts_fatal("ts_coordinates: undefined coordinate system requested");

    int oldval = _coordinates;
    _coordinates = system;
    return oldval;
}

// convert relative coordinates to absolute
int ax(float x)
{
    if (!_graphics_flag)
        _graphics_init();

    if (_coordinates == CARTESIAN)
        return (x * XMAX);
    else
        return (x * SXMAX);
}

int ay(float y)
{
    if (!_graphics_flag)
        _graphics_init();

    if (_coordinates == CARTESIAN)
        return (y * YMAX);
    else
        return (y * SYMAX);
}

// convert euclidic coordinates to screen coordinates
int sx(int x)
{
    if (!_graphics_flag)
        _graphics_init();
    return _destmap->b->w / 2 + x;
}
int sy(int y)
{
    if (!_graphics_flag)
        _graphics_init();
    return _destmap->b->h / 2 - y;
}

// convert screen coordinates to euclidic
int cx(int x)
{
    if (!_graphics_flag)
        _graphics_init();
    return x - SXMAX / 2;
}

int cy(int y)
{
    if (!_graphics_flag)
        _graphics_init();
    return SYMAX / 2 - y;
}

// draw a grid with absolute coordinates
void ts_agrid()
{
    if (!_graphics_flag)
        _graphics_init();

    int i, j;
    int oldpar = ts_textmode(_bgcolor);

    if (_coordinates == CARTESIAN) {
        ts_circle(0, 0, 5);
        ts_vline(-1, -YMAX, YMAX);
        ts_vline(1, -YMAX, YMAX);
        ts_hline(-XMAX, XMAX, 1);
        ts_hline(-XMAX, XMAX, -1);


        for (i = 0; i < XMAX; i += 100) {
            ts_vline(i, -YMAX, YMAX);
            ts_vline(-i, -YMAX, YMAX);
        }
        for (i = 0; i < YMAX; i += 100) {
            ts_hline(-XMAX, XMAX, i);
            ts_hline(-XMAX, XMAX, -i);
        }

        for (i = 0; i < XMAX; i += 50) {
            if (i % 100 == 0)
                continue;
            for (j = 0; j < YMAX; j += 4) {
                ts_putpixel(i, j);
                ts_putpixel(i, -j);
                ts_putpixel(-i, j);
                ts_putpixel(-i, -j);
            }
        }

        for (i = 0; i < YMAX; i += 50) {
            if (i % 100 == 0)
                continue;
            for (j = 0; j < XMAX; j += 4) {
                ts_putpixel(j, i);
                ts_putpixel(j, -i);
                ts_putpixel(-j, i);
                ts_putpixel(-j, -i);
            }
        }

        ts_printf_centre(15, 15, "0");
        for (i = 100; i < XMAX; i += 100) {
            ts_rect(i - 1, 5, i + 1, -5);
            ts_rect(-i - 1, 5, -i + 1, -5);
            ts_printf_centre(i, 15, "%d", i);
            ts_printf_centre(-i, 15, "-%d", i);
        }

        for (i = 100; i < YMAX; i += 100) {
            ts_rect(5, i - 1, -5, i + 1);
            ts_rect(5, -i - 1, -5, -i + 1);
            ts_printf(15, i, "%d", i);
            ts_printf(15, -i, "-%d", i);
        }

    } else {
        ts_circle(0, 0, 5);
        ts_vline(0, 0, SYMAX);
        ts_vline(1, 0, SYMAX);
        ts_vline(2, 0, SYMAX);
        ts_hline(0, SXMAX, 0);
        ts_hline(0, SXMAX, 1);
        ts_hline(0, SXMAX, 2);
        for (i = 0; i < SXMAX; i += 100)
            ts_vline(i, 0, SYMAX);
        for (i = 0; i < SYMAX; i += 100)
            ts_hline(0, SXMAX, i);


        for (i = 0; i < SXMAX; i += 50) {
            if (i % 100 == 0)
                continue;
            for (j = 0; j < SYMAX; j += 4)
                ts_putpixel(i, j);
        }

        for (i = 0; i < SYMAX; i += 50) {
            if (i % 100 == 0)
                continue;
            for (j = 0; j < SXMAX; j += 4)
                ts_putpixel(j, i);
        }

        ts_printf_centre(15, 15, "0");
        for (i = 100; i < SXMAX; i += 100) {
            ts_rect(i - 1, 5, i + 1, 0);
            ts_printf_centre(i, 15, "%d", i);
        }

        for (i = 100; i < SYMAX; i += 100) {
            ts_rect(5, i - 1, 0, i + 1);
            ts_printf(15, i, "%d", i);
        }
    }

    ts_textmode(oldpar);
}

// draw a grid with relative coordinates
void ts_rgrid()
{
    if (!_graphics_flag)
        _graphics_init();

    int i, j;
    int oldpar = ts_textmode(_bgcolor);

    if (_coordinates == CARTESIAN) {
        ts_circle(0, 0, 5);
        ts_vline(-1, -YMAX, YMAX);
        ts_vline(1, -YMAX, YMAX);
        ts_hline(-XMAX, XMAX, 1);
        ts_hline(-XMAX, XMAX, -1);

        for (i = 0; i <= XMAX; i += XMAX / 2) {
            ts_vline(i, YMAX, -YMAX);
            ts_vline(-i, YMAX, -YMAX);
        }

        for (i = 0; i <= YMAX; i += YMAX / 2) {
            ts_hline(-XMAX, XMAX, i);
            ts_hline(-XMAX, XMAX, -i);
        }

        for (i = 0; i < XMAX; i += XMAX / 10) {
            for (j = 0; j < YMAX; j += 4) {
                ts_putpixel(i, j);
                ts_putpixel(i, -j);
                ts_putpixel(-i, j);
                ts_putpixel(-i, -j);
            }
        }

        for (i = 0; i < YMAX; i += YMAX / 10) {
            for (j = 0; j < XMAX; j += 4) {
                ts_putpixel(j, i);
                ts_putpixel(j, -i);
                ts_putpixel(-j, i);
                ts_putpixel(-j, -i);
            }
        }

        ts_printf_centre(15, 15, "0");
        ts_printf_centre(XMAX / 2, 15, "0.5");
        ts_printf_centre(-XMAX / 2, 15, "-0.5");
        ts_printf_centre(15, YMAX / 2, "0.5");
        ts_printf_centre(15, -YMAX / 2, "-0.5");
        for (i = 0; i < XMAX; i += XMAX / 2) {
            ts_rect(i - 1, 5, i + 1, -5);
            ts_rect(-i - 1, 5, -i + 1, -5);
        }

        for (i = 0; i < YMAX; i += YMAX / 2) {
            ts_rect(5, i - 1, -5, i + 1);
            ts_rect(5, -i - 1, -5, -i + 1);
        }

    } else {
        ts_circle(0, 0, 5);
        ts_vline(0, 0, SYMAX);
        ts_vline(1, 0, SYMAX);
        ts_vline(2, 0, SYMAX);
        ts_hline(0, SXMAX, 0);
        ts_hline(0, SXMAX, 1);
        ts_hline(0, SXMAX, 2);

        for (i = 0; i < SXMAX; i += SXMAX / 4)
            ts_vline(i, 0, SYMAX);
        for (i = 0; i < SYMAX; i += SYMAX / 4)
            ts_hline(0, SXMAX, i);


        for (i = 0; i < SXMAX; i += SXMAX / 20)
            for (j = 0; j < SYMAX; j += 4)
                ts_putpixel(i, j);

        for (i = 0; i < SYMAX; i += SYMAX / 20)
            for (j = 0; j < SXMAX; j += 4)
                ts_putpixel(j, i);

        ts_printf_centre(15, 15, "0");

        int it = 0;
        for (i = 0; i < SXMAX; i += SXMAX / 4) {
            ts_rect(i - 1, 5, i + 1, -5);
            if (it > 0)
                ts_printf_centre(it * SXMAX / 4, 15, "%3.2f",
                                 (float) it / 4);
            it++;
        }

        it = 0;
        for (i = 0; i < SYMAX; i += SYMAX / 4) {
            ts_rect(5, i - 1, -5, i + 1);
            if (it > 0)
                ts_printf_centre(25, it * SYMAX / 4, "%3.2f",
                                 (float) it / 4);
            it++;
        }

    }
    ts_textmode(oldpar);
}


top
Persoonlijke pagina Universiteit GentTscope
Allegro | Cygwin | Gcc
© See license.html for copyright information