A Tool To Plot Mathematical Function

Plot.cs

using Microsoft.ClearScript;
using Microsoft.ClearScript.V8;
using Microsoft.Win32;
using System;
using System.IO;
using System.IO.Packaging;
using System.Printing;
using System.Windows;
using System.Windows.Media;
using System.Windows.Xps.Packaging;

namespace Plot
{
    class Plot
    {
        [STAThread]
        static void Main(string[] args)
        {
            Console.Title = "Plot";
            var openFileDialog = new OpenFileDialog()
            {
                Filter = "JavaScript|*.js"
            };
            while (openFileDialog.ShowDialog() != true) ;
            Console.WriteLine("Entry: ");
            Console.WriteLine("Start: ");
            Console.WriteLine("End: ");
            Console.WriteLine("Step: ");
            Console.CursorTop = 0;
            Console.CursorLeft = 7;
            var entry = Console.ReadLine();
            Console.CursorLeft = 7;
            var start = double.Parse(Console.ReadLine());
            Console.CursorLeft = 5;
            var end = double.Parse(Console.ReadLine());
            Console.CursorLeft = 6;
            var step = double.Parse(Console.ReadLine());
            var fileStream = new FileStream(openFileDialog.FileName, FileMode.Open);
            var streamReader = new StreamReader(fileStream);
            var v8ScriptEngine = new V8ScriptEngine();
            var v8Script = v8ScriptEngine.Compile(streamReader.ReadToEnd());
            v8ScriptEngine.Execute(v8Script);
            while (v8ScriptEngine.Script[entry] is Undefined)
            {
                MessageBox.Show(entry + " not exist!");
                Console.CursorTop = 0;
                Console.CursorLeft = 7;
                for (int i = 0; i < entry.Length; i++)
                {
                    Console.Write((char)0);
                }
                Console.CursorLeft = 7;
                entry = Console.ReadLine();
                Console.CursorTop = 4;
            }
            var saveFileDialog = new SaveFileDialog()
            {
                Filter = "XPS 文档|*.xps"
            };
            while (saveFileDialog.ShowDialog() != true) ;
            var package = Package.Open(saveFileDialog.FileName, FileMode.Create);
            var xpsDocument = new XpsDocument(package);
            var xpsDocumentWriter = XpsDocument.CreateXpsDocumentWriter(xpsDocument);
            int count = (int)((end - start) / step) + 1;
            var abscissa = new double[count];
            var ordinate = new double[count];
            for (int i = 0; i < count; i++)
            {
                abscissa[i] = start + step * i;
                ordinate[i] = v8ScriptEngine.Script[entry](abscissa[i]);
            }
            double semiWidth = Math.Ceiling(Math.Max(Math.Abs(start), Math.Abs(end)));
            double width = semiWidth * 200;
            double height = semiWidth * 200;
            double thickness = 0.01;
            double phi = 0.5 * Math.Sqrt(5) + 0.5;
            var drawingVisual = new DrawingVisual();
            var drawingContext = drawingVisual.RenderOpen();
            drawingContext.PushTransform(new TranslateTransform(width / 2, height / 2));
            drawingContext.PushTransform(new ScaleTransform(100, -100));
            var orangeRedPen = new Pen(Brushes.OrangeRed, thickness);
            var thickOrangeRedPen = new Pen(Brushes.OrangeRed, thickness * phi);
            var thinOrangeRedPen = new Pen(Brushes.OrangeRed, thickness / phi);
            drawingContext.DrawLine(thickOrangeRedPen, new Point(0, semiWidth), new Point(0, -semiWidth));
            drawingContext.DrawLine(thickOrangeRedPen, new Point(semiWidth, 0), new Point(-semiWidth, 0));
            var thickBluePen = new Pen(Brushes.Blue, thickness * phi);
            for (int i = 1; i < (int)semiWidth * 10; i++)
            {
                var pen = (Pen)null;
                if (i % 10 != 0)
                {
                    pen = thinOrangeRedPen;
                }
                else
                {
                    pen = orangeRedPen;
                }
                drawingContext.DrawLine(pen, new Point(0.1 * i, semiWidth), new Point(0.1 * i, -semiWidth));
                drawingContext.DrawLine(pen, new Point(semiWidth, 0.1 * i), new Point(-semiWidth, 0.1 * i));
                drawingContext.DrawLine(pen, new Point(-0.1 * i, semiWidth), new Point(-0.1 * i, -semiWidth));
                drawingContext.DrawLine(pen, new Point(semiWidth, -0.1 * i), new Point(-semiWidth, -0.1 * i));
            }
            for (int i = 0; i < count - 1; i++)
            {
                if (!double.IsNaN(ordinate[i]) && !double.IsNaN(ordinate[i + 1]))
                {
                    drawingContext.DrawLine(thickBluePen, new Point(abscissa[i], ordinate[i]), new Point(abscissa[i + 1], ordinate[i + 1]));
                }
            }
            drawingContext.Close();
            var printTicket = new PrintTicket()
            {
                PageMediaSize = new PageMediaSize(width, height)
            };
            xpsDocumentWriter.Write(drawingVisual, printTicket);
            xpsDocument.Close();
            package.Close();
        }
    }
}

 

转载于:https://www.cnblogs.com/JebediahKerman/p/A_Tool_To_Plot_Mathematical_Function.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值