⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graphics.c

📁 书名:C语言科学与艺术,以前交钱下载的
💻 C
字号:
/* * File: graphics.c * Version: 2.0 * Last modified on Tue Sep 20 09:35:42 1994 by eroberts * ----------------------------------------------------- * This file implements the graphics.h interface for the * DOS/Borland C platform.  This version implements only the * standard graphics library; the extensions in extgraph.c are * implemented only for the Windows version. * * The DOS graphics library needs to know where the device * driver files are located.  In the standard install script, * that information is inserted in the Makefile so that no * additional installer interaction is required. */#include <stdio.h>#include <graphics.h>#include <math.h>#include "genlib.h"#include "graphics.h"#ifndef BCPATH#error graphics.c requires that the Makefile define BCPATH#endif/* * Other constants * --------------- * PixelsPerInch -- Device resolution (not obtainable directly) * Epsilon       -- Small arithmetic offset to reduce aliasing/banding * Pi            -- Mathematical constant pi */#define PixelsPerInch 72#define Epsilon       0.00000000001#define Pi            3.1415926535/* * Global variables * ---------------- * initialized  -- TRUE if initialization has been done * pixelWidth   -- Width of screen in pixels * pixelHeight  -- Height of screen in pixels */static bool initialized = FALSE;static int pixelWidth, pixelHeight;/* Private function prototypes */static double Radians(double degrees);static int Round(double x);static double InchesX(int x);static double InchesY(int y);static int PixelsX(double x);static int PixelsY(double y);static int ScaleX(double x);static int ScaleY(double y);/* Exported entries */void InitGraphics(void){    int gdriver, gmode, ec;    if (!initialized) {        gdriver = DETECT;        initgraph(&gdriver, &gmode, BCPATH "\\BGI");        ec = graphresult();        if (ec != grOk) {            printf("Error: %s\n", grapherrormsg(ec));            (void) getchar();            exit(1);        }        pixelWidth = getmaxx();        pixelHeight = getmaxy();        initialized = TRUE;    }    cleardevice();}void MovePen(double x, double y){    moveto(ScaleX(x), ScaleY(y));}void DrawLine(double dx, double dy){    linerel(PixelsX(dx), -PixelsY(dy));}void DrawArc(double r, double start, double sweep){    int kstart, ksweep, kend;    double cx, cy;    kstart = Round(start);    ksweep = Round(sweep);    if (ksweep < 0) {        kstart += ksweep;        ksweep = -ksweep;    }    if (kstart < 0) {        kstart = 360 - (-kstart % 360);    } else {        kstart %= 360;    }    if (ksweep >= 360) {        kstart = 0;        kend = 360;    } else {        kend = (kstart + ksweep) % 360;    }    cx = GetCurrentX() + r * cos(Radians(start + 180));    cy = GetCurrentY() + r * sin(Radians(start + 180));    arc(ScaleX(cx), ScaleY(cy), kstart, kend, PixelsX(r));    MovePen(cx + r * cos(Radians(start + sweep)),            cy + r * sin(Radians(start + sweep)));}double GetWindowWidth(void){    return (InchesX(pixelWidth));}double GetWindowHeight(void){    return (InchesY(pixelHeight));}double GetCurrentX(void){    return (InchesX(getx()));}double GetCurrentY(void){    return (InchesY(pixelHeight - gety()));}/* * Utility functions * ----------------- * This section contains several extremely short utility functions * that improve the readability of the code. *//* * Function: Radians * Usage: radians = Radians(degrees); * ---------------------------------- * This functions convert an angle in degrees to radians. */static double Radians(double degrees){    return (degrees * Pi / 180);}/* * Function: Round * Usage: n = Round(x); * -------------------- * This function rounds a double to the nearest integer. */static int Round(double x){    return ((int) floor(x + 0.5));}/* * Functions: InchesX, InchesY * Usage: inches = InchesX(pixels); *        inches = InchesY(pixels); * -------------------------------- * These functions convert distances measured in pixels to inches. * Because the resolution may not be uniform in the horizontal and * vertical directions, the coordinates are treated separately. */static double InchesX(int x){    return ((double) x / PixelsPerInch);}static double InchesY(int y){    return ((double) y / PixelsPerInch);}/* * Functions: PixelsX, PixelsY * Usage: pixels = PixelsX(inches); *        pixels = PixelsY(inches); * -------------------------------- * These functions convert distances measured in inches to pixels. */static int PixelsX(double x){    return (Round(x * PixelsPerInch + Epsilon));}static int PixelsY(double y){    return (Round(y * PixelsPerInch + Epsilon));}/* * Functions: ScaleX, ScaleY * Usage: pixels = ScaleX(inches); *        pixels = ScaleY(inches); * -------------------------------- * These functions are like PixelsX and PixelsY but convert coordinates * rather than lengths.  The difference is that y-coordinate values must * be inverted top to bottom to support the cartesian coordinates of * the graphics.h model. */static int ScaleX(double x){    return (PixelsX(x));}static int ScaleY(double y){    return (pixelHeight - PixelsY(y));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -