Subversion Repositories Applications.annuaire

Compare Revisions

Ignore whitespace Rev 76 → Rev 77

/trunk/composants/statistiques/lib/lang/en.inc.php
New file
0,0 → 1,536
<?php
/*=======================================================================
// File: EN.INC.PHP
// Description: English language file for error messages
// Created: 2006-01-25
// Ver: $Id: en.inc.php 1886 2009-10-01 23:30:16Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
// Note: Format of each error message is array(<error message>,<number of arguments>)
$_jpg_messages = array(
 
/*
** Headers already sent error. This is formatted as HTML different since this will be sent back directly as text
*/
10 => array('<table border="1"><tr><td style="color:darkred; font-size:1.2em;"><b>JpGraph Error:</b>
HTTP headers have already been sent.<br>Caused by output from file <b>%s</b> at line <b>%d</b>.</td></tr><tr><td><b>Explanation:</b><br>HTTP headers have already been sent back to the browser indicating the data as text before the library got a chance to send it\'s image HTTP header to this browser. This makes it impossible for the library to send back image data to the browser (since that would be interpretated as text by the browser and show up as junk text).<p>Most likely you have some text in your script before the call to <i>Graph::Stroke()</i>. If this texts gets sent back to the browser the browser will assume that all data is plain text. Look for any text, even spaces and newlines, that might have been sent back to the browser. <p>For example it is a common mistake to leave a blank line before the opening "<b>&lt;?php</b>".</td></tr></table>',2),
 
/*
** Setup errors
*/
11 => array('No path specified for CACHE_DIR. Please specify CACHE_DIR manually in jpg-config.inc',0),
12 => array('No path specified for TTF_DIR and path can not be determined automatically. Please specify TTF_DIR manually (in jpg-config.inc).',0),
13 => array('The installed PHP version (%s) is not compatible with this release of the library. The library requires at least PHP version %s',2),
 
 
/*
** jpgraph_bar
*/
 
2001 => array('Number of colors is not the same as the number of patterns in BarPlot::SetPattern()',0),
2002 => array('Unknown pattern specified in call to BarPlot::SetPattern()',0),
2003 => array('Number of X and Y points are not equal. Number of X-points: %d Number of Y-points: %d',2),
2004 => array('All values for a barplot must be numeric. You have specified value nr [%d] == %s',2),
2005 => array('You have specified an empty array for shadow colors in the bar plot.',0),
2006 => array('Unknown position for values on bars : %s',1),
2007 => array('Cannot create GroupBarPlot from empty plot array.',0),
2008 => array('Group bar plot element nbr %d is undefined or empty.',0),
2009 => array('One of the objects submitted to GroupBar is not a BarPlot. Make sure that you create the GroupBar plot from an array of BarPlot or AccBarPlot objects. (Class = %s)',1),
2010 => array('Cannot create AccBarPlot from empty plot array.',0),
2011 => array('Acc bar plot element nbr %d is undefined or empty.',1),
2012 => array('One of the objects submitted to AccBar is not a BarPlot. Make sure that you create the AccBar plot from an array of BarPlot objects. (Class=%s)',1),
2013 => array('You have specified an empty array for shadow colors in the bar plot.',0),
2014 => array('Number of datapoints for each data set in accbarplot must be the same',0),
2015 => array('Individual bar plots in an AccBarPlot or GroupBarPlot can not have specified X-coordinates',0),
 
 
/*
** jpgraph_date
*/
 
3001 => array('It is only possible to use either SetDateAlign() or SetTimeAlign() but not both',0),
 
/*
** jpgraph_error
*/
 
4002 => array('Error in input data to LineErrorPlot. Number of data points must be a multiple of 3',0),
 
/*
** jpgraph_flags
*/
 
5001 => array('Unknown flag size (%d).',1),
5002 => array('Flag index %s does not exist.',1),
5003 => array('Invalid ordinal number (%d) specified for flag index.',1),
5004 => array('The (partial) country name %s does not have a corresponding flag image. The flag may still exist but under another name, e.g. instead of "usa" try "united states".',1),
 
 
/*
** jpgraph_gantt
*/
 
6001 => array('Internal error. Height for ActivityTitles is < 0',0),
6002 => array('You can\'t specify negative sizes for Gantt graph dimensions. Use 0 to indicate that you want the library to automatically determine a dimension.',0),
6003 => array('Invalid format for Constrain parameter at index=%d in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Constrain-To,Constrain-Type)',1),
6004 => array('Invalid format for Progress parameter at index=%d in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Progress)',1),
6005 => array('SetScale() is not meaningful with Gantt charts.',0),
6006 => array('Cannot autoscale Gantt chart. No dated activities exist. [GetBarMinMax() start >= n]',0),
6007 => array('Sanity check for automatic Gantt chart size failed. Either the width (=%d) or height (=%d) is larger than MAX_GANTTIMG_SIZE. This could potentially be caused by a wrong date in one of the activities.',2),
6008 => array('You have specified a constrain from row=%d to row=%d which does not have any activity',2),
6009 => array('Unknown constrain type specified from row=%d to row=%d',2),
6010 => array('Illegal icon index for Gantt builtin icon [%d]',1),
6011 => array('Argument to IconImage must be string or integer',0),
6012 => array('Unknown type in Gantt object title specification',0),
6015 => array('Illegal vertical position %d',1),
6016 => array('Date string (%s) specified for Gantt activity can not be interpretated. Please make sure it is a valid time string, e.g. 2005-04-23 13:30',1),
6017 => array('Unknown date format in GanttScale (%s).',1),
6018 => array('Interval for minutes must divide the hour evenly, e.g. 1,5,10,12,15,20,30 etc You have specified an interval of %d minutes.',1),
6019 => array('The available width (%d) for minutes are to small for this scale to be displayed. Please use auto-sizing or increase the width of the graph.',1),
6020 => array('Interval for hours must divide the day evenly, e.g. 0:30, 1:00, 1:30, 4:00 etc. You have specified an interval of %d',1),
6021 => array('Unknown formatting style for week.',0),
6022 => array('Gantt scale has not been specified.',0),
6023 => array('If you display both hour and minutes the hour interval must be 1 (Otherwise it doesn\'t make sense to display minutes).',0),
6024 => array('CSIM Target must be specified as a string. Start of target is: %d',1),
6025 => array('CSIM Alt text must be specified as a string. Start of alt text is: %d',1),
6027 => array('Progress value must in range [0, 1]',0),
6028 => array('Specified height (%d) for gantt bar is out of range.',1),
6029 => array('Offset for vertical line must be in range [0,1]',0),
6030 => array('Unknown arrow direction for link.',0),
6031 => array('Unknown arrow type for link.',0),
6032 => array('Internal error: Unknown path type (=%d) specified for link.',1),
6033 => array('Array of fonts must contain arrays with 3 elements, i.e. (Family, Style, Size)',0),
 
/*
** jpgraph_gradient
*/
 
7001 => array('Unknown gradient style (=%d).',1),
 
/*
** jpgraph_iconplot
*/
 
8001 => array('Mix value for icon must be between 0 and 100.',0),
8002 => array('Anchor position for icons must be one of "top", "bottom", "left", "right" or "center"',0),
8003 => array('It is not possible to specify both an image file and a country flag for the same icon.',0),
8004 => array('In order to use Country flags as icons you must include the "jpgraph_flags.php" file.',0),
 
/*
** jpgraph_imgtrans
*/
 
9001 => array('Value for image transformation out of bounds. Vanishing point on horizon must be specified as a value between 0 and 1.',0),
 
/*
** jpgraph_lineplot
*/
 
10001 => array('LinePlot::SetFilled() is deprecated. Use SetFillColor()',0),
10002 => array('Plot too complicated for fast line Stroke. Use standard Stroke()',0),
10003 => array('Each plot in an accumulated lineplot must have the same number of data points.',0),
 
/*
** jpgraph_log
*/
 
11001 => array('Your data contains non-numeric values.',0),
11002 => array('Negative data values can not be used in a log scale.',0),
11003 => array('Your data contains non-numeric values.',0),
11004 => array('Scale error for logarithmic scale. You have a problem with your data values. The max value must be greater than 0. It is mathematically impossible to have 0 in a logarithmic scale.',0),
11005 => array('Specifying tick interval for a logarithmic scale is undefined. Remove any calls to SetTextLabelStart() or SetTextTickInterval() on the logarithmic scale.',0),
 
/*
** jpgraph_mgraph
*/
 
12001 => array("You are using GD 2.x and are trying to use a background images on a non truecolor image. To use background images with GD 2.x it is necessary to enable truecolor by setting the USE_TRUECOLOR constant to TRUE. Due to a bug in GD 2.0.1 using any truetype fonts with truecolor images will result in very poor quality fonts.",0),
12002 => array('Incorrect file name for MGraph::SetBackgroundImage() : %s Must have a valid image extension (jpg,gif,png) when using auto detection of image type',1),
12003 => array('Unknown file extension (%s) in MGraph::SetBackgroundImage() for filename: %s',2),
12004 => array('The image format of your background image (%s) is not supported in your system configuration. ',1),
12005 => array('Can\'t read background image: %s',1),
12006 => array('Illegal sizes specified for width or height when creating an image, (width=%d, height=%d)',2),
12007 => array('Argument to MGraph::Add() is not a valid GD image handle.',0),
12008 => array('Your PHP (and GD-lib) installation does not appear to support any known graphic formats.',0),
12009 => array('Your PHP installation does not support the chosen graphic format: %s',1),
12010 => array('Can\'t create or stream image to file %s Check that PHP has enough permission to write a file to the current directory.',1),
12011 => array('Can\'t create truecolor image. Check that you really have GD2 library installed.',0),
12012 => array('Can\'t create image. Check that you really have GD2 library installed.',0),
 
/*
** jpgraph_pie3d
*/
 
14001 => array('Pie3D::ShowBorder() . Deprecated function. Use Pie3D::SetEdge() to control the edges around slices.',0),
14002 => array('PiePlot3D::SetAngle() 3D Pie projection angle must be between 5 and 85 degrees.',0),
14003 => array('Internal assertion failed. Pie3D::Pie3DSlice',0),
14004 => array('Slice start angle must be between 0 and 360 degrees.',0),
14005 => array('Pie3D Internal error: Trying to wrap twice when looking for start index',0,),
14006 => array('Pie3D Internal Error: Z-Sorting algorithm for 3D Pies is not working properly (2). Trying to wrap twice while stroking.',0),
14007 => array('Width for 3D Pie is 0. Specify a size > 0',0),
 
/*
** jpgraph_pie
*/
 
15001 => array('PiePLot::SetTheme() Unknown theme: %s',1),
15002 => array('Argument to PiePlot::ExplodeSlice() must be an integer',0),
15003 => array('Argument to PiePlot::Explode() must be an array with integer distances.',0),
15004 => array('Slice start angle must be between 0 and 360 degrees.',0),
15005 => array('PiePlot::SetFont() is deprecated. Use PiePlot->value->SetFont() instead.',0),
15006 => array('PiePlot::SetSize() Radius for pie must either be specified as a fraction [0, 0.5] of the size of the image or as an absolute size in pixels in the range [10, 1000]',0),
15007 => array('PiePlot::SetFontColor() is deprecated. Use PiePlot->value->SetColor() instead.',0),
15008 => array('PiePlot::SetLabelType() Type for pie plots must be 0 or 1 (not %d).',1),
15009 => array('Illegal pie plot. Sum of all data is zero for Pie Plot',0),
15010 => array('Sum of all data is 0 for Pie.',0),
15011 => array('In order to use image transformation you must include the file jpgraph_imgtrans.php in your script.',0),
 
/*
** jpgraph_plotband
*/
 
16001 => array('Density for pattern must be between 1 and 100. (You tried %f)',1),
16002 => array('No positions specified for pattern.',0),
16003 => array('Unknown pattern specification (%d)',0),
16004 => array('Min value for plotband is larger than specified max value. Please correct.',0),
 
 
/*
** jpgraph_polar
*/
 
17001 => array('Polar plots must have an even number of data point. Each data point is a tuple (angle,radius).',0),
17002 => array('Unknown alignment specified for X-axis title. (%s)',1),
//17003 => array('Set90AndMargin() is not supported for polar graphs.',0),
17004 => array('Unknown scale type for polar graph. Must be "lin" or "log"',0),
 
/*
** jpgraph_radar
*/
 
18001 => array('Client side image maps not supported for RadarPlots.',0),
18002 => array('RadarGraph::SupressTickMarks() is deprecated. Use HideTickMarks() instead.',0),
18003 => array('Illegal scale for radarplot (%s). Must be \'lin\' or \'log\'',1),
18004 => array('Radar Plot size must be between 0.1 and 1. (Your value=%f)',1),
18005 => array('RadarPlot Unsupported Tick density: %d',1),
18006 => array('Minimum data %f (Radar plots should only be used when all data points > 0)',1),
18007 => array('Number of titles does not match number of points in plot.',0),
18008 => array('Each radar plot must have the same number of data points.',0),
 
/*
** jpgraph_regstat
*/
 
19001 => array('Spline: Number of X and Y coordinates must be the same',0),
19002 => array('Invalid input data for spline. Two or more consecutive input X-values are equal. Each input X-value must differ since from a mathematical point of view it must be a one-to-one mapping, i.e. each X-value must correspond to exactly one Y-value.',0),
19003 => array('Bezier: Number of X and Y coordinates must be the same',0),
 
/*
** jpgraph_scatter
*/
 
20001 => array('Fieldplots must have equal number of X and Y points.',0),
20002 => array('Fieldplots must have an angle specified for each X and Y points.',0),
20003 => array('Scatterplot must have equal number of X and Y points.',0),
 
/*
** jpgraph_stock
*/
 
21001 => array('Data values for Stock charts must contain an even multiple of %d data points.',1),
 
/*
** jpgraph_plotmark
*/
 
23001 => array('This marker "%s" does not exist in color with index: %d',2),
23002 => array('Mark color index too large for marker "%s"',1),
23003 => array('A filename must be specified if you set the mark type to MARK_IMG.',0),
 
/*
** jpgraph_utils
*/
 
24001 => array('FuncGenerator : No function specified. ',0),
24002 => array('FuncGenerator : Syntax error in function specification ',0),
24003 => array('DateScaleUtils: Unknown tick type specified in call to GetTicks()',0),
24004 => array('ReadCSV2: Column count mismatch in %s line %d',2),
/*
** jpgraph
*/
 
25001 => array('This PHP installation is not configured with the GD library. Please recompile PHP with GD support to run JpGraph. (Neither function imagetypes() nor imagecreatefromstring() does exist)',0),
25002 => array('Your PHP installation does not seem to have the required GD library. Please see the PHP documentation on how to install and enable the GD library.',0),
25003 => array('General PHP error : At %s:%d : %s',3),
25004 => array('General PHP error : %s ',1),
25005 => array('Can\'t access PHP_SELF, PHP global variable. You can\'t run PHP from command line if you want to use the \'auto\' naming of cache or image files.',0),
25006 => array('Usage of FF_CHINESE (FF_BIG5) font family requires that your PHP setup has the iconv() function. By default this is not compiled into PHP (needs the "--width-iconv" when configured).',0),
25007 => array('You are trying to use the locale (%s) which your PHP installation does not support. Hint: Use \'\' to indicate the default locale for this geographic region.',1),
25008 => array('Image width/height argument in Graph::Graph() must be numeric',0),
25009 => array('You must specify what scale to use with a call to Graph::SetScale()',0),
 
25010 => array('Graph::Add() You tried to add a null plot to the graph.',0),
25011 => array('Graph::AddY2() You tried to add a null plot to the graph.',0),
25012 => array('Graph::AddYN() You tried to add a null plot to the graph.',0),
25013 => array('You can only add standard plots to multiple Y-axis',0),
25014 => array('Graph::AddText() You tried to add a null text to the graph.',0),
25015 => array('Graph::AddLine() You tried to add a null line to the graph.',0),
25016 => array('Graph::AddBand() You tried to add a null band to the graph.',0),
25017 => array('You are using GD 2.x and are trying to use a background images on a non truecolor image. To use background images with GD 2.x it is necessary to enable truecolor by setting the USE_TRUECOLOR constant to TRUE. Due to a bug in GD 2.0.1 using any truetype fonts with truecolor images will result in very poor quality fonts.',0),
25018 => array('Incorrect file name for Graph::SetBackgroundImage() : "%s" Must have a valid image extension (jpg,gif,png) when using auto detection of image type',1),
25019 => array('Unknown file extension (%s) in Graph::SetBackgroundImage() for filename: "%s"',2),
 
25020 => array('Graph::SetScale(): Specified Max value must be larger than the specified Min value.',0),
25021 => array('Unknown scale specification for Y-scale. (%s)',1),
25022 => array('Unknown scale specification for X-scale. (%s)',1),
25023 => array('Unsupported Y2 axis type: "%s" Must be one of (lin,log,int)',1),
25024 => array('Unsupported Y axis type: "%s" Must be one of (lin,log,int)',1),
25025 => array('Unsupported Tick density: %d',1),
25026 => array('Can\'t draw unspecified Y-scale. You have either: 1. Specified an Y axis for auto scaling but have not supplied any plots. 2. Specified a scale manually but have forgot to specify the tick steps',0),
25027 => array('Can\'t open cached CSIM "%s" for reading.',1),
25028 => array('Apache/PHP does not have permission to write to the CSIM cache directory (%s). Check permissions.',1),
25029 => array('Can\'t write CSIM "%s" for writing. Check free space and permissions.',1),
 
25030 => array('Missing script name in call to StrokeCSIM(). You must specify the name of the actual image script as the first parameter to StrokeCSIM().',0),
25031 => array('You must specify what scale to use with a call to Graph::SetScale().',0),
25032 => array('No plots for Y-axis nbr:%d',1),
25033 => array('',0),
25034 => array('Can\'t draw unspecified X-scale. No plots specified.',0),
25035 => array('You have enabled clipping. Clipping is only supported for graphs at 0 or 90 degrees rotation. Please adjust you current angle (=%d degrees) or disable clipping.',1),
25036 => array('Unknown AxisStyle() : %s',1),
25037 => array('The image format of your background image (%s) is not supported in your system configuration. ',1),
25038 => array('Background image seems to be of different type (has different file extension) than specified imagetype. Specified: %s File: %s',2),
25039 => array('Can\'t read background image: "%s"',1),
 
25040 => array('It is not possible to specify both a background image and a background country flag.',0),
25041 => array('In order to use Country flags as backgrounds you must include the "jpgraph_flags.php" file.',0),
25042 => array('Unknown background image layout',0),
25043 => array('Unknown title background style.',0),
25044 => array('Cannot use auto scaling since it is impossible to determine a valid min/max value of the Y-axis (only null values).',0),
25045 => array('Font families FF_HANDWRT and FF_BOOK are no longer available due to copyright problem with these fonts. Fonts can no longer be distributed with JpGraph. Please download fonts from http://corefonts.sourceforge.net/',0),
25046 => array('Specified TTF font family (id=%d) is unknown or does not exist. Please note that TTF fonts are not distributed with JpGraph for copyright reasons. You can find the MS TTF WEB-fonts (arial, courier etc) for download at http://corefonts.sourceforge.net/',1),
25047 => array('Style %s is not available for font family %s',2),
25048 => array('Unknown font style specification [%s].',1),
25049 => array('Font file "%s" is not readable or does not exist.',1),
 
25050 => array('First argument to Text::Text() must be a string.',0),
25051 => array('Invalid direction specified for text.',0),
25052 => array('PANIC: Internal error in SuperScript::Stroke(). Unknown vertical alignment for text',0),
25053 => array('PANIC: Internal error in SuperScript::Stroke(). Unknown horizontal alignment for text',0),
25054 => array('Internal error: Unknown grid axis %s',1),
25055 => array('Axis::SetTickDirection() is deprecated. Use Axis::SetTickSide() instead',0),
25056 => array('SetTickLabelMargin() is deprecated. Use Axis::SetLabelMargin() instead.',0),
25057 => array('SetTextTicks() is deprecated. Use SetTextTickInterval() instead.',0),
25058 => array('Text label interval must be specified >= 1.',0),
25059 => array('SetLabelPos() is deprecated. Use Axis::SetLabelSide() instead.',0),
 
25060 => array('Unknown alignment specified for X-axis title. (%s)',1),
25061 => array('Unknown alignment specified for Y-axis title. (%s)',1),
25062 => array('Labels at an angle are not supported on Y-axis',0),
25063 => array('Ticks::SetPrecision() is deprecated. Use Ticks::SetLabelFormat() (or Ticks::SetFormatCallback()) instead',0),
25064 => array('Minor or major step size is 0. Check that you haven\'t got an accidental SetTextTicks(0) in your code. If this is not the case you might have stumbled upon a bug in JpGraph. Please report this and if possible include the data that caused the problem',0),
25065 => array('Tick positions must be specified as an array()',0),
25066 => array('When manually specifying tick positions and labels the number of labels must be the same as the number of specified ticks.',0),
25067 => array('Your manually specified scale and ticks is not correct. The scale seems to be too small to hold any of the specified tick marks.',0),
25068 => array('A plot has an illegal scale. This could for example be that you are trying to use text auto scaling to draw a line plot with only one point or that the plot area is too small. It could also be that no input data value is numeric (perhaps only \'-\' or \'x\')',0),
25069 => array('Grace must be larger then 0',0),
25070 => array('Either X or Y data arrays contains non-numeric values. Check that the data is really specified as numeric data and not as strings. It is an error to specify data for example as \'-2345.2\' (using quotes).',0),
25071 => array('You have specified a min value with SetAutoMin() which is larger than the maximum value used for the scale. This is not possible.',0),
25072 => array('You have specified a max value with SetAutoMax() which is smaller than the minimum value used for the scale. This is not possible.',0),
25073 => array('Internal error. Integer scale algorithm comparison out of bound (r=%f)',1),
25074 => array('Internal error. The scale range is negative (%f) [for %s scale] This problem could potentially be caused by trying to use \"illegal\" values in the input data arrays (like trying to send in strings or only NULL values) which causes the auto scaling to fail.',2),
25075 => array('Can\'t automatically determine ticks since min==max.',0),
25077 => array('Adjustment factor for color must be > 0',0),
25078 => array('Unknown color: %s',1),
25079 => array('Unknown color specification: %s, size=%d',2),
 
25080 => array('Alpha parameter for color must be between 0.0 and 1.0',0),
25081 => array('Selected graphic format is either not supported or unknown [%s]',1),
25082 => array('Illegal sizes specified for width or height when creating an image, (width=%d, height=%d)',2),
25083 => array('Illegal image size when copying image. Size for copied to image is 1 pixel or less.',0),
25084 => array('Failed to create temporary GD canvas. Possible Out of memory problem.',0),
25085 => array('An image can not be created from the supplied string. It is either in a format not supported or the string is representing an corrupt image.',0),
25086 => array('You only seem to have GD 1.x installed. To enable Alphablending requires GD 2.x or higher. Please install GD or make sure the constant USE_GD2 is specified correctly to reflect your installation. By default it tries to auto detect what version of GD you have installed. On some very rare occasions it may falsely detect GD2 where only GD1 is installed. You must then set USE_GD2 to false.',0),
25087 => array('This PHP build has not been configured with TTF support. You need to recompile your PHP installation with FreeType support.',0),
25088 => array('You have a misconfigured GD font support. The call to imagefontwidth() fails.',0),
25089 => array('You have a misconfigured GD font support. The call to imagefontheight() fails.',0),
 
25090 => array('Unknown direction specified in call to StrokeBoxedText() [%s]',1),
25091 => array('Internal font does not support drawing text at arbitrary angle. Use TTF fonts instead.',0),
25092 => array('There is either a configuration problem with TrueType or a problem reading font file "%s" Make sure file exists and is in a readable place for the HTTP process. (If \'basedir\' restriction is enabled in PHP then the font file must be located in the document root.). It might also be a wrongly installed FreeType library. Try upgrading to at least FreeType 2.1.13 and recompile GD with the correct setup so it can find the new FT library.',1),
25093 => array('Can not read font file "%s" in call to Image::GetBBoxTTF. Please make sure that you have set a font before calling this method and that the font is installed in the TTF directory.',1),
25094 => array('Direction for text most be given as an angle between 0 and 90.',0),
25095 => array('Unknown font font family specification. ',0),
25096 => array('Can\'t allocate any more colors in palette image. Image has already allocated maximum of %d colors and the palette is now full. Change to a truecolor image instead',0),
25097 => array('Color specified as empty string in PushColor().',0),
25098 => array('Negative Color stack index. Unmatched call to PopColor()',0),
25099 => array('Parameters for brightness and Contrast out of range [-1,1]',0),
 
25100 => array('Problem with color palette and your GD setup. Please disable anti-aliasing or use GD2 with true-color. If you have GD2 library installed please make sure that you have set the USE_GD2 constant to true and truecolor is enabled.',0),
25101 => array('Illegal numeric argument to SetLineStyle(): (%d)',1),
25102 => array('Illegal string argument to SetLineStyle(): %s',1),
25103 => array('Illegal argument to SetLineStyle %s',1),
25104 => array('Unknown line style: %s',1),
25105 => array('NULL data specified for a filled polygon. Check that your data is not NULL.',0),
25106 => array('Image::FillToBorder : Can not allocate more colors',0),
25107 => array('Can\'t write to file "%s". Check that the process running PHP has enough permission.',1),
25108 => array('Can\'t stream image. This is most likely due to a faulty PHP/GD setup. Try to recompile PHP and use the built-in GD library that comes with PHP.',0),
25109 => array('Your PHP (and GD-lib) installation does not appear to support any known graphic formats. You need to first make sure GD is compiled as a module to PHP. If you also want to use JPEG images you must get the JPEG library. Please see the PHP docs for details.',0),
 
25110 => array('Your PHP installation does not support the chosen graphic format: %s',1),
25111 => array('Can\'t delete cached image %s. Permission problem?',1),
25112 => array('Cached imagefile (%s) has file date in the future.',1),
25113 => array('Can\'t delete cached image "%s". Permission problem?',1),
25114 => array('PHP has not enough permissions to write to the cache file "%s". Please make sure that the user running PHP has write permission for this file if you wan to use the cache system with JpGraph.',1),
25115 => array('Can\'t set permission for cached image "%s". Permission problem?',1),
25116 => array('Cant open file from cache "%s"',1),
25117 => array('Can\'t open cached image "%s" for reading.',1),
25118 => array('Can\'t create directory "%s". Make sure PHP has write permission to this directory.',1),
25119 => array('Can\'t set permissions for "%s". Permission problems?',1),
 
25120 => array('Position for legend must be given as percentage in range 0-1',0),
25121 => array('Empty input data array specified for plot. Must have at least one data point.',0),
25122 => array('Stroke() must be implemented by concrete subclass to class Plot',0),
25123 => array('You can\'t use a text X-scale with specified X-coords. Use a "int" or "lin" scale instead.',0),
25124 => array('The input data array must have consecutive values from position 0 and forward. The given y-array starts with empty values (NULL)',0),
25125 => array('Illegal direction for static line',0),
25126 => array('Can\'t create truecolor image. Check that the GD2 library is properly setup with PHP.',0),
25127 => array('The library has been configured for automatic encoding conversion of Japanese fonts. This requires that PHP has the mb_convert_encoding() function. Your PHP installation lacks this function (PHP needs the "--enable-mbstring" when compiled).',0),
25128 => array('The function imageantialias() is not available in your PHP installation. Use the GD version that comes with PHP and not the standalone version.',0),
25129 => array('Anti-alias can not be used with dashed lines. Please disable anti-alias or use solid lines.',0),
25130 => array('Too small plot area. (%d x %d). With the given image size and margins there is to little space left for the plot. Increase the plot size or reduce the margins.',2),
 
25131 => array('StrokeBoxedText2() only supports TTF fonts and not built-in bitmap fonts.',0),
 
/*
** jpgraph_led
*/
 
25500 => array('Multibyte strings must be enabled in the PHP installation in order to run the LED module so that the function mb_strlen() is available. See PHP documentation for more information.',0),
 
/*
**---------------------------------------------------------------------------------------------
** Pro-version strings
**---------------------------------------------------------------------------------------------
*/
 
/*
** jpgraph_table
*/
 
27001 => array('GTextTable: Invalid argument to Set(). Array argument must be 2 dimensional',0),
27002 => array('GTextTable: Invalid argument to Set()',0),
27003 => array('GTextTable: Wrong number of arguments to GTextTable::SetColor()',0),
27004 => array('GTextTable: Specified cell range to be merged is not valid.',0),
27005 => array('GTextTable: Cannot merge already merged cells in the range: (%d,%d) to (%d,%d)',4),
27006 => array('GTextTable: Column argument = %d is outside specified table size.',1),
27007 => array('GTextTable: Row argument = %d is outside specified table size.',1),
27008 => array('GTextTable: Column and row size arrays must match the dimensions of the table',0),
27009 => array('GTextTable: Number of table columns or rows are 0. Make sure Init() or Set() is called.',0),
27010 => array('GTextTable: No alignment specified in call to SetAlign()',0),
27011 => array('GTextTable: Unknown alignment specified in SetAlign(). Horizontal=%s, Vertical=%s',2),
27012 => array('GTextTable: Internal error. Invalid alignment specified =%s',1),
27013 => array('GTextTable: Argument to FormatNumber() must be a string.',0),
27014 => array('GTextTable: Table is not initilaized with either a call to Set() or Init()',0),
27015 => array('GTextTable: Cell image constrain type must be TIMG_WIDTH or TIMG_HEIGHT',0),
 
/*
** jpgraph_windrose
*/
 
22001 => array('Total percentage for all windrose legs in a windrose plot can not exceed 100%% !\n(Current max is: %d)',1),
22002 => array('Graph is too small to have a scale. Please make the graph larger.',0),
22004 => array('Label specification for windrose directions must have 16 values (one for each compass direction).',0),
22005 => array('Line style for radial lines must be on of ("solid","dotted","dashed","longdashed") ',0),
22006 => array('Illegal windrose type specified.',0),
22007 => array('To few values for the range legend.',0),
22008 => array('Internal error: Trying to plot free Windrose even though type is not a free windrose',0),
22009 => array('You have specified the same direction twice, once with an angle and once with a compass direction (%f degrees)',0),
22010 => array('Direction must either be a numeric value or one of the 16 compass directions',0),
22011 => array('Windrose index must be numeric or direction label. You have specified index=%d',1),
22012 => array('Windrose radial axis specification contains a direction which is not enabled.',0),
22013 => array('You have specified the look&feel for the same compass direction twice, once with text and once with index (Index=%d)',1),
22014 => array('Index for compass direction must be between 0 and 15.',0),
22015 => array('You have specified an undefined Windrose plot type.',0),
22016 => array('Windrose leg index must be numeric or direction label.',0),
22017 => array('Windrose data contains a direction which is not enabled. Please adjust what labels are displayed.',0),
22018 => array('You have specified data for the same compass direction twice, once with text and once with index (Index=%d)',1),
22019 => array('Index for direction must be between 0 and 15. You can\'t specify angles for a Regular Windplot, only index and compass directions.',0),
22020 => array('Windrose plot is too large to fit the specified Graph size. Please use WindrosePlot::SetSize() to make the plot smaller or increase the size of the Graph in the initial WindroseGraph() call.',0),
22021 => array('It is only possible to add Text, IconPlot or WindrosePlot to a Windrose Graph',0),
/*
** jpgraph_odometer
*/
 
13001 => array('Unknown needle style (%d).',1),
13002 => array('Value for odometer (%f) is outside specified scale [%f,%f]',3),
 
/*
** jpgraph_barcode
*/
 
1001 => array('Unknown encoder specification: %s',1),
1002 => array('Data validation failed. Can\'t encode [%s] using encoding "%s"',2),
1003 => array('Internal encoding error. Trying to encode %s is not possible in Code 128',1),
1004 => array('Internal barcode error. Unknown UPC-E encoding type: %s',1),
1005 => array('Internal error. Can\'t encode character tuple (%s, %s) in Code-128 charset C',2),
1006 => array('Internal encoding error for CODE 128. Trying to encode control character in CHARSET != A',0),
1007 => array('Internal encoding error for CODE 128. Trying to encode DEL in CHARSET != B',0),
1008 => array('Internal encoding error for CODE 128. Trying to encode small letters in CHARSET != B',0),
1009 => array('Encoding using CODE 93 is not yet supported.',0),
1010 => array('Encoding using POSTNET is not yet supported.',0),
1011 => array('Non supported barcode backend for type %s',1),
 
/*
** PDF417
*/
26000 => array('PDF417: The PDF417 module requires that the PHP installation must support the function bcmod(). This is normally enabled at compile time. See documentation for more information.',0),
26001 => array('PDF417: Number of Columns must be >= 1 and <= 30',0),
26002 => array('PDF417: Error level must be between 0 and 8',0),
26003 => array('PDF417: Invalid format for input data to encode with PDF417',0),
26004 => array('PDF417: Can\'t encode given data with error level %d and %d columns since it results in too many symbols or more than 90 rows.',2),
26005 => array('PDF417: Can\'t open file "%s" for writing',1),
26006 => array('PDF417: Internal error. Data files for PDF417 cluster %d is corrupted.',1),
26007 => array('PDF417: Internal error. GetPattern: Illegal Code Value = %d (row=%d)',2),
26008 => array('PDF417: Internal error. Mode not found in mode list!! mode=%d',1),
26009 => array('PDF417: Encode error: Illegal character. Can\'t encode character with ASCII code=%d',1),
26010 => array('PDF417: Internal error: No input data in decode.',0),
26011 => array('PDF417: Encoding error. Can\'t use numeric encoding on non-numeric data.',0),
26012 => array('PDF417: Internal error. No input data to decode for Binary compressor.',0),
26013 => array('PDF417: Internal error. Checksum error. Coefficient tables corrupted.',0),
26014 => array('PDF417: Internal error. No data to calculate codewords on.',0),
26015 => array('PDF417: Internal error. State transition table entry 0 is NULL. Entry 1 = (%s)',1),
26016 => array('PDF417: Internal error: Unrecognized state transition mode in decode.',0),
 
/*
** jpgraph_contour
*/
 
28001 => array('Third argument to Contour must be an array of colors.',0),
28002 => array('Number of colors must equal the number of isobar lines specified',0),
28003 => array('ContourPlot Internal Error: isobarHCrossing: Coloumn index too large (%d)',1),
28004 => array('ContourPlot Internal Error: isobarHCrossing: Row index too large (%d)',1),
28005 => array('ContourPlot Internal Error: isobarVCrossing: Row index too large (%d)',1),
28006 => array('ContourPlot Internal Error: isobarVCrossing: Col index too large (%d)',1),
28007 => array('ContourPlot interpolation factor is too large (>5)',0),
 
/*
* jpgraph_matrix and colormap
*/
29201 => array('Min range value must be less or equal to max range value for colormaps',0),
29202 => array('The distance between min and max value is too small for numerical precision',0),
29203 => array('Number of color quantification level must be at least %d',1),
29204 => array('Number of colors (%d) is invalid for this colormap. It must be a number that can be written as: %d + k*%d',3),
29205 => array('Colormap specification out of range. Must be an integer in range [0,%d]',1),
29206 => array('Invalid object added to MatrixGraph',0),
29207 => array('Empty input data specified for MatrixPlot',0),
29208 => array('Unknown side specifiction for matrix labels "%s"',1),
29209 => array('CSIM Target matrix must be the same size as the data matrix (csim=%d x %d, data=%d x %d)',4),
29210 => array('CSIM Target for matrix labels does not match the number of labels (csim=%d, labels=%d)',2),
 
);
 
?>
/trunk/composants/statistiques/lib/lang/prod.inc.php
New file
0,0 → 1,383
<?php
/*=======================================================================
// File: PROD.INC.PHP
// Description: Special localization file with the same error messages
// for all errors.
// Created: 2006-02-18
// Ver: $Id: prod.inc.php 1886 2009-10-01 23:30:16Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
// The single error message for all errors
DEFINE('DEFAULT_ERROR_MESSAGE','We are sorry but the system could not generate the requested image. Please contact site support to resolve this problem. Problem no: #');
 
// Note: Format of each error message is array(<error message>,<number of arguments>)
$_jpg_messages = array(
 
/*
** Headers already sent error. This is formatted as HTML different since this will be sent back directly as text
*/
10 => array('<table border=1><tr><td><font color=darkred size=4><b>JpGraph Error:</b>
HTTP headers have already been sent.<br>Caused by output from file <b>%s</b> at line <b>%d</b>.</font></td></tr><tr><td><b>Explanation:</b><br>HTTP headers have already been sent back to the browser indicating the data as text before the library got a chance to send it\'s image HTTP header to this browser. This makes it impossible for the library to send back image data to the browser (since that would be interpretated as text by the browser and show up as junk text).<p>Most likely you have some text in your script before the call to <i>Graph::Stroke()</i>. If this texts gets sent back to the browser the browser will assume that all data is plain text. Look for any text, even spaces and newlines, that might have been sent back to the browser. <p>For example it is a common mistake to leave a blank line before the opening "<b>&lt;?php</b>".</td></tr></table>',2),
 
 
11 => array(DEFAULT_ERROR_MESSAGE.'11',0),
12 => array(DEFAULT_ERROR_MESSAGE.'12',0),
13 => array(DEFAULT_ERROR_MESSAGE.'13',0),
2001 => array(DEFAULT_ERROR_MESSAGE.'2001',0),
2002 => array(DEFAULT_ERROR_MESSAGE.'2002',0),
2003 => array(DEFAULT_ERROR_MESSAGE.'2003',0),
2004 => array(DEFAULT_ERROR_MESSAGE.'2004',0),
2005 => array(DEFAULT_ERROR_MESSAGE.'2005',0),
2006 => array(DEFAULT_ERROR_MESSAGE.'2006',0),
2007 => array(DEFAULT_ERROR_MESSAGE.'2007',0),
2008 => array(DEFAULT_ERROR_MESSAGE.'2008',0),
2009 => array(DEFAULT_ERROR_MESSAGE.'2009',0),
2010 => array(DEFAULT_ERROR_MESSAGE.'2010',0),
2011 => array(DEFAULT_ERROR_MESSAGE.'2011',0),
2012 => array(DEFAULT_ERROR_MESSAGE.'2012',0),
2013 => array(DEFAULT_ERROR_MESSAGE.'2013',0),
2014 => array(DEFAULT_ERROR_MESSAGE.'2014',0),
3001 => array(DEFAULT_ERROR_MESSAGE.'3001',0),
4002 => array(DEFAULT_ERROR_MESSAGE.'4002',0),
5001 => array(DEFAULT_ERROR_MESSAGE.'5001',0),
5002 => array(DEFAULT_ERROR_MESSAGE.'5002',0),
5003 => array(DEFAULT_ERROR_MESSAGE.'5003',0),
5004 => array(DEFAULT_ERROR_MESSAGE.'5004',0),
6001 => array(DEFAULT_ERROR_MESSAGE.'6001',0),
6002 => array(DEFAULT_ERROR_MESSAGE.'6002',0),
6003 => array(DEFAULT_ERROR_MESSAGE.'6003',0),
6004 => array(DEFAULT_ERROR_MESSAGE.'6004',0),
6005 => array(DEFAULT_ERROR_MESSAGE.'6005',0),
6006 => array(DEFAULT_ERROR_MESSAGE.'6006',0),
6007 => array(DEFAULT_ERROR_MESSAGE.'6007',0),
6008 => array(DEFAULT_ERROR_MESSAGE.'6008',0),
6009 => array(DEFAULT_ERROR_MESSAGE.'6009',0),
6010 => array(DEFAULT_ERROR_MESSAGE.'6010',0),
6011 => array(DEFAULT_ERROR_MESSAGE.'6011',0),
6012 => array(DEFAULT_ERROR_MESSAGE.'6012',0),
6015 => array(DEFAULT_ERROR_MESSAGE.'6015',0),
6016 => array(DEFAULT_ERROR_MESSAGE.'6016',0),
6017 => array(DEFAULT_ERROR_MESSAGE.'6017',0),
6018 => array(DEFAULT_ERROR_MESSAGE.'6018',0),
6019 => array(DEFAULT_ERROR_MESSAGE.'6019',0),
6020 => array(DEFAULT_ERROR_MESSAGE.'6020',0),
6021 => array(DEFAULT_ERROR_MESSAGE.'6021',0),
6022 => array(DEFAULT_ERROR_MESSAGE.'6022',0),
6023 => array(DEFAULT_ERROR_MESSAGE.'6023',0),
6024 => array(DEFAULT_ERROR_MESSAGE.'6024',0),
6025 => array(DEFAULT_ERROR_MESSAGE.'6025',0),
6027 => array(DEFAULT_ERROR_MESSAGE.'6027',0),
6028 => array(DEFAULT_ERROR_MESSAGE.'6028',0),
6029 => array(DEFAULT_ERROR_MESSAGE.'6029',0),
6030 => array(DEFAULT_ERROR_MESSAGE.'6030',0),
6031 => array(DEFAULT_ERROR_MESSAGE.'6031',0),
6032 => array(DEFAULT_ERROR_MESSAGE.'6032',0),
6033 => array(DEFAULT_ERROR_MESSAGE.'6033',0),
7001 => array(DEFAULT_ERROR_MESSAGE.'7001',0),
8001 => array(DEFAULT_ERROR_MESSAGE.'8001',0),
8002 => array(DEFAULT_ERROR_MESSAGE.'8002',0),
8003 => array(DEFAULT_ERROR_MESSAGE.'8003',0),
8004 => array(DEFAULT_ERROR_MESSAGE.'8004',0),
9001 => array(DEFAULT_ERROR_MESSAGE.'9001',0),
10001 => array(DEFAULT_ERROR_MESSAGE.'10001',0),
10002 => array(DEFAULT_ERROR_MESSAGE.'10002',0),
10003 => array(DEFAULT_ERROR_MESSAGE.'10003',0),
11001 => array(DEFAULT_ERROR_MESSAGE.'11001',0),
11002 => array(DEFAULT_ERROR_MESSAGE.'11002',0),
11003 => array(DEFAULT_ERROR_MESSAGE.'11003',0),
11004 => array(DEFAULT_ERROR_MESSAGE.'11004',0),
11005 => array(DEFAULT_ERROR_MESSAGE.'11005',0),
12001 => array(DEFAULT_ERROR_MESSAGE.'12001',0),
12002 => array(DEFAULT_ERROR_MESSAGE.'12002',0),
12003 => array(DEFAULT_ERROR_MESSAGE.'12003',0),
12004 => array(DEFAULT_ERROR_MESSAGE.'12004',0),
12005 => array(DEFAULT_ERROR_MESSAGE.'12005',0),
12006 => array(DEFAULT_ERROR_MESSAGE.'12006',0),
12007 => array(DEFAULT_ERROR_MESSAGE.'12007',0),
12008 => array(DEFAULT_ERROR_MESSAGE.'12008',0),
12009 => array(DEFAULT_ERROR_MESSAGE.'12009',0),
12010 => array(DEFAULT_ERROR_MESSAGE.'12010',0),
12011 => array(DEFAULT_ERROR_MESSAGE.'12011',0),
12012 => array(DEFAULT_ERROR_MESSAGE.'12012',0),
14001 => array(DEFAULT_ERROR_MESSAGE.'14001',0),
14002 => array(DEFAULT_ERROR_MESSAGE.'14002',0),
14003 => array(DEFAULT_ERROR_MESSAGE.'14003',0),
14004 => array(DEFAULT_ERROR_MESSAGE.'14004',0),
14005 => array(DEFAULT_ERROR_MESSAGE.'14005',0),
14006 => array(DEFAULT_ERROR_MESSAGE.'14006',0),
14007 => array(DEFAULT_ERROR_MESSAGE.'14007',0),
15001 => array(DEFAULT_ERROR_MESSAGE.'15001',0),
15002 => array(DEFAULT_ERROR_MESSAGE.'15002',0),
15003 => array(DEFAULT_ERROR_MESSAGE.'15003',0),
15004 => array(DEFAULT_ERROR_MESSAGE.'15004',0),
15005 => array(DEFAULT_ERROR_MESSAGE.'15005',0),
15006 => array(DEFAULT_ERROR_MESSAGE.'15006',0),
15007 => array(DEFAULT_ERROR_MESSAGE.'15007',0),
15008 => array(DEFAULT_ERROR_MESSAGE.'15008',0),
15009 => array(DEFAULT_ERROR_MESSAGE.'15009',0),
15010 => array(DEFAULT_ERROR_MESSAGE.'15010',0),
15011 => array(DEFAULT_ERROR_MESSAGE.'15011',0),
16001 => array(DEFAULT_ERROR_MESSAGE.'16001',0),
16002 => array(DEFAULT_ERROR_MESSAGE.'16002',0),
16003 => array(DEFAULT_ERROR_MESSAGE.'16003',0),
16004 => array(DEFAULT_ERROR_MESSAGE.'16004',0),
17001 => array(DEFAULT_ERROR_MESSAGE.'17001',0),
17002 => array(DEFAULT_ERROR_MESSAGE.'17002',0),
17004 => array(DEFAULT_ERROR_MESSAGE.'17004',0),
18001 => array(DEFAULT_ERROR_MESSAGE.'18001',0),
18002 => array(DEFAULT_ERROR_MESSAGE.'18002',0),
18003 => array(DEFAULT_ERROR_MESSAGE.'18003',0),
18004 => array(DEFAULT_ERROR_MESSAGE.'18004',0),
18005 => array(DEFAULT_ERROR_MESSAGE.'18005',0),
18006 => array(DEFAULT_ERROR_MESSAGE.'18006',0),
18007 => array(DEFAULT_ERROR_MESSAGE.'18007',0),
18008 => array(DEFAULT_ERROR_MESSAGE.'18008',0),
19001 => array(DEFAULT_ERROR_MESSAGE.'19001',0),
19002 => array(DEFAULT_ERROR_MESSAGE.'19002',0),
19003 => array(DEFAULT_ERROR_MESSAGE.'19003',0),
20001 => array(DEFAULT_ERROR_MESSAGE.'20001',0),
20002 => array(DEFAULT_ERROR_MESSAGE.'20002',0),
20003 => array(DEFAULT_ERROR_MESSAGE.'20003',0),
21001 => array(DEFAULT_ERROR_MESSAGE.'21001',0),
23001 => array(DEFAULT_ERROR_MESSAGE.'23001',0),
23002 => array(DEFAULT_ERROR_MESSAGE.'23002',0),
23003 => array(DEFAULT_ERROR_MESSAGE.'23003',0),
24001 => array(DEFAULT_ERROR_MESSAGE.'24001',0),
24002 => array(DEFAULT_ERROR_MESSAGE.'24002',0),
24003 => array(DEFAULT_ERROR_MESSAGE.'24003',0),
24004 => array(DEFAULT_ERROR_MESSAGE.'24004',0),
25001 => array(DEFAULT_ERROR_MESSAGE.'25001',0),
25002 => array(DEFAULT_ERROR_MESSAGE.'25002',0),
25003 => array(DEFAULT_ERROR_MESSAGE.'25003',0),
25004 => array(DEFAULT_ERROR_MESSAGE.'25004',0),
25005 => array(DEFAULT_ERROR_MESSAGE.'25005',0),
25006 => array(DEFAULT_ERROR_MESSAGE.'25006',0),
25007 => array(DEFAULT_ERROR_MESSAGE.'25007',0),
25008 => array(DEFAULT_ERROR_MESSAGE.'25008',0),
25009 => array(DEFAULT_ERROR_MESSAGE.'25009',0),
25010 => array(DEFAULT_ERROR_MESSAGE.'25010',0),
25011 => array(DEFAULT_ERROR_MESSAGE.'25011',0),
25012 => array(DEFAULT_ERROR_MESSAGE.'25012',0),
25013 => array(DEFAULT_ERROR_MESSAGE.'25013',0),
25014 => array(DEFAULT_ERROR_MESSAGE.'25014',0),
25015 => array(DEFAULT_ERROR_MESSAGE.'25015',0),
25016 => array(DEFAULT_ERROR_MESSAGE.'25016',0),
25017 => array(DEFAULT_ERROR_MESSAGE.'25017',0),
25018 => array(DEFAULT_ERROR_MESSAGE.'25018',0),
25019 => array(DEFAULT_ERROR_MESSAGE.'25019',0),
25020 => array(DEFAULT_ERROR_MESSAGE.'25020',0),
25021 => array(DEFAULT_ERROR_MESSAGE.'25021',0),
25022 => array(DEFAULT_ERROR_MESSAGE.'25022',0),
25023 => array(DEFAULT_ERROR_MESSAGE.'25023',0),
25024 => array(DEFAULT_ERROR_MESSAGE.'25024',0),
25025 => array(DEFAULT_ERROR_MESSAGE.'25025',0),
25026 => array(DEFAULT_ERROR_MESSAGE.'25026',0),
25027 => array(DEFAULT_ERROR_MESSAGE.'25027',0),
25028 => array(DEFAULT_ERROR_MESSAGE.'25028',0),
25029 => array(DEFAULT_ERROR_MESSAGE.'25029',0),
25030 => array(DEFAULT_ERROR_MESSAGE.'25030',0),
25031 => array(DEFAULT_ERROR_MESSAGE.'25031',0),
25032 => array(DEFAULT_ERROR_MESSAGE.'25032',0),
25033 => array(DEFAULT_ERROR_MESSAGE.'25033',0),
25034 => array(DEFAULT_ERROR_MESSAGE.'25034',0),
25035 => array(DEFAULT_ERROR_MESSAGE.'25035',0),
25036 => array(DEFAULT_ERROR_MESSAGE.'25036',0),
25037 => array(DEFAULT_ERROR_MESSAGE.'25037',0),
25038 => array(DEFAULT_ERROR_MESSAGE.'25038',0),
25039 => array(DEFAULT_ERROR_MESSAGE.'25039',0),
25040 => array(DEFAULT_ERROR_MESSAGE.'25040',0),
25041 => array(DEFAULT_ERROR_MESSAGE.'25041',0),
25042 => array(DEFAULT_ERROR_MESSAGE.'25042',0),
25043 => array(DEFAULT_ERROR_MESSAGE.'25043',0),
25044 => array(DEFAULT_ERROR_MESSAGE.'25044',0),
25045 => array(DEFAULT_ERROR_MESSAGE.'25045',0),
25046 => array(DEFAULT_ERROR_MESSAGE.'25046',0),
25047 => array(DEFAULT_ERROR_MESSAGE.'25047',0),
25048 => array(DEFAULT_ERROR_MESSAGE.'25048',0),
25049 => array(DEFAULT_ERROR_MESSAGE.'25049',0),
25050 => array(DEFAULT_ERROR_MESSAGE.'25050',0),
25051 => array(DEFAULT_ERROR_MESSAGE.'25051',0),
25052 => array(DEFAULT_ERROR_MESSAGE.'25052',0),
25053 => array(DEFAULT_ERROR_MESSAGE.'25053',0),
25054 => array(DEFAULT_ERROR_MESSAGE.'25054',0),
25055 => array(DEFAULT_ERROR_MESSAGE.'25055',0),
25056 => array(DEFAULT_ERROR_MESSAGE.'25056',0),
25057 => array(DEFAULT_ERROR_MESSAGE.'25057',0),
25058 => array(DEFAULT_ERROR_MESSAGE.'25058',0),
25059 => array(DEFAULT_ERROR_MESSAGE.'25059',0),
25060 => array(DEFAULT_ERROR_MESSAGE.'25060',0),
25061 => array(DEFAULT_ERROR_MESSAGE.'25061',0),
25062 => array(DEFAULT_ERROR_MESSAGE.'25062',0),
25063 => array(DEFAULT_ERROR_MESSAGE.'25063',0),
25064 => array(DEFAULT_ERROR_MESSAGE.'25064',0),
25065 => array(DEFAULT_ERROR_MESSAGE.'25065',0),
25066 => array(DEFAULT_ERROR_MESSAGE.'25066',0),
25067 => array(DEFAULT_ERROR_MESSAGE.'25067',0),
25068 => array(DEFAULT_ERROR_MESSAGE.'25068',0),
25069 => array(DEFAULT_ERROR_MESSAGE.'25069',0),
25070 => array(DEFAULT_ERROR_MESSAGE.'25070',0),
25071 => array(DEFAULT_ERROR_MESSAGE.'25071',0),
25072 => array(DEFAULT_ERROR_MESSAGE.'25072',0),
25073 => array(DEFAULT_ERROR_MESSAGE.'25073',0),
25074 => array(DEFAULT_ERROR_MESSAGE.'25074',0),
25075 => array(DEFAULT_ERROR_MESSAGE.'25075',0),
25077 => array(DEFAULT_ERROR_MESSAGE.'25077',0),
25078 => array(DEFAULT_ERROR_MESSAGE.'25078',0),
25079 => array(DEFAULT_ERROR_MESSAGE.'25079',0),
25080 => array(DEFAULT_ERROR_MESSAGE.'25080',0),
25081 => array(DEFAULT_ERROR_MESSAGE.'25081',0),
25082 => array(DEFAULT_ERROR_MESSAGE.'25082',0),
25083 => array(DEFAULT_ERROR_MESSAGE.'25083',0),
25084 => array(DEFAULT_ERROR_MESSAGE.'25084',0),
25085 => array(DEFAULT_ERROR_MESSAGE.'25085',0),
25086 => array(DEFAULT_ERROR_MESSAGE.'25086',0),
25087 => array(DEFAULT_ERROR_MESSAGE.'25087',0),
25088 => array(DEFAULT_ERROR_MESSAGE.'25088',0),
25089 => array(DEFAULT_ERROR_MESSAGE.'25089',0),
25090 => array(DEFAULT_ERROR_MESSAGE.'25090',0),
25091 => array(DEFAULT_ERROR_MESSAGE.'25091',0),
25092 => array(DEFAULT_ERROR_MESSAGE.'25092',0),
25093 => array(DEFAULT_ERROR_MESSAGE.'25093',0),
25094 => array(DEFAULT_ERROR_MESSAGE.'25094',0),
25095 => array(DEFAULT_ERROR_MESSAGE.'25095',0),
25096 => array(DEFAULT_ERROR_MESSAGE.'25096',0),
25097 => array(DEFAULT_ERROR_MESSAGE.'25097',0),
25098 => array(DEFAULT_ERROR_MESSAGE.'25098',0),
25099 => array(DEFAULT_ERROR_MESSAGE.'25099',0),
25100 => array(DEFAULT_ERROR_MESSAGE.'25100',0),
25101 => array(DEFAULT_ERROR_MESSAGE.'25101',0),
25102 => array(DEFAULT_ERROR_MESSAGE.'25102',0),
25103 => array(DEFAULT_ERROR_MESSAGE.'25103',0),
25104 => array(DEFAULT_ERROR_MESSAGE.'25104',0),
25105 => array(DEFAULT_ERROR_MESSAGE.'25105',0),
25106 => array(DEFAULT_ERROR_MESSAGE.'25106',0),
25107 => array(DEFAULT_ERROR_MESSAGE.'25107',0),
25108 => array(DEFAULT_ERROR_MESSAGE.'25108',0),
25109 => array(DEFAULT_ERROR_MESSAGE.'25109',0),
25110 => array(DEFAULT_ERROR_MESSAGE.'25110',0),
25111 => array(DEFAULT_ERROR_MESSAGE.'25111',0),
25112 => array(DEFAULT_ERROR_MESSAGE.'25112',0),
25113 => array(DEFAULT_ERROR_MESSAGE.'25113',0),
25114 => array(DEFAULT_ERROR_MESSAGE.'25114',0),
25115 => array(DEFAULT_ERROR_MESSAGE.'25115',0),
25116 => array(DEFAULT_ERROR_MESSAGE.'25116',0),
25117 => array(DEFAULT_ERROR_MESSAGE.'25117',0),
25118 => array(DEFAULT_ERROR_MESSAGE.'25118',0),
25119 => array(DEFAULT_ERROR_MESSAGE.'25119',0),
25120 => array(DEFAULT_ERROR_MESSAGE.'25120',0),
25121 => array(DEFAULT_ERROR_MESSAGE.'25121',0),
25122 => array(DEFAULT_ERROR_MESSAGE.'25122',0),
25123 => array(DEFAULT_ERROR_MESSAGE.'25123',0),
25124 => array(DEFAULT_ERROR_MESSAGE.'25124',0),
25125 => array(DEFAULT_ERROR_MESSAGE.'25125',0),
25126 => array(DEFAULT_ERROR_MESSAGE.'25126',0),
25127 => array(DEFAULT_ERROR_MESSAGE.'25127',0),
25128 => array(DEFAULT_ERROR_MESSAGE.'25128',0),
25129 => array(DEFAULT_ERROR_MESSAGE.'25129',0),
25130 => array(DEFAULT_ERROR_MESSAGE.'25130',0),
25131 => array(DEFAULT_ERROR_MESSAGE.'25131',0),
25500 => array(DEFAULT_ERROR_MESSAGE.'25500',0),
24003 => array(DEFAULT_ERROR_MESSAGE.'24003',0),
24004 => array(DEFAULT_ERROR_MESSAGE.'24004',0),
24005 => array(DEFAULT_ERROR_MESSAGE.'24005',0),
24006 => array(DEFAULT_ERROR_MESSAGE.'24006',0),
24007 => array(DEFAULT_ERROR_MESSAGE.'24007',0),
24008 => array(DEFAULT_ERROR_MESSAGE.'24008',0),
24009 => array(DEFAULT_ERROR_MESSAGE.'24009',0),
24010 => array(DEFAULT_ERROR_MESSAGE.'24010',0),
24011 => array(DEFAULT_ERROR_MESSAGE.'24011',0),
24012 => array(DEFAULT_ERROR_MESSAGE.'24012',0),
24013 => array(DEFAULT_ERROR_MESSAGE.'24013',0),
24014 => array(DEFAULT_ERROR_MESSAGE.'24014',0),
24015 => array(DEFAULT_ERROR_MESSAGE.'24015',0),
22001 => array(DEFAULT_ERROR_MESSAGE.'22001',0),
22002 => array(DEFAULT_ERROR_MESSAGE.'22002',0),
22004 => array(DEFAULT_ERROR_MESSAGE.'22004',0),
22005 => array(DEFAULT_ERROR_MESSAGE.'22005',0),
22006 => array(DEFAULT_ERROR_MESSAGE.'22006',0),
22007 => array(DEFAULT_ERROR_MESSAGE.'22007',0),
22008 => array(DEFAULT_ERROR_MESSAGE.'22008',0),
22009 => array(DEFAULT_ERROR_MESSAGE.'22009',0),
22010 => array(DEFAULT_ERROR_MESSAGE.'22010',0),
22011 => array(DEFAULT_ERROR_MESSAGE.'22011',0),
22012 => array(DEFAULT_ERROR_MESSAGE.'22012',0),
22013 => array(DEFAULT_ERROR_MESSAGE.'22013',0),
22014 => array(DEFAULT_ERROR_MESSAGE.'22014',0),
22015 => array(DEFAULT_ERROR_MESSAGE.'22015',0),
22016 => array(DEFAULT_ERROR_MESSAGE.'22016',0),
22017 => array(DEFAULT_ERROR_MESSAGE.'22017',0),
22018 => array(DEFAULT_ERROR_MESSAGE.'22018',0),
22019 => array(DEFAULT_ERROR_MESSAGE.'22019',0),
22020 => array(DEFAULT_ERROR_MESSAGE.'22020',0),
13001 => array(DEFAULT_ERROR_MESSAGE.'13001',0),
13002 => array(DEFAULT_ERROR_MESSAGE.'13002',0),
1001 => array(DEFAULT_ERROR_MESSAGE.'1001',0),
1002 => array(DEFAULT_ERROR_MESSAGE.'1002',0),
1003 => array(DEFAULT_ERROR_MESSAGE.'1003',0),
1004 => array(DEFAULT_ERROR_MESSAGE.'1004',0),
1005 => array(DEFAULT_ERROR_MESSAGE.'1005',0),
1006 => array(DEFAULT_ERROR_MESSAGE.'1006',0),
1007 => array(DEFAULT_ERROR_MESSAGE.'1007',0),
1008 => array(DEFAULT_ERROR_MESSAGE.'1008',0),
1009 => array(DEFAULT_ERROR_MESSAGE.'1009',0),
1010 => array(DEFAULT_ERROR_MESSAGE.'1010',0),
1011 => array(DEFAULT_ERROR_MESSAGE.'1011',0),
26000 => array(DEFAULT_ERROR_MESSAGE.'26000',0),
26001 => array(DEFAULT_ERROR_MESSAGE.'26001',0),
26002 => array(DEFAULT_ERROR_MESSAGE.'26002',0),
26003 => array(DEFAULT_ERROR_MESSAGE.'26003',0),
26004 => array(DEFAULT_ERROR_MESSAGE.'26004',0),
26005 => array(DEFAULT_ERROR_MESSAGE.'26005',0),
26006 => array(DEFAULT_ERROR_MESSAGE.'26006',0),
26007 => array(DEFAULT_ERROR_MESSAGE.'26007',0),
26008 => array(DEFAULT_ERROR_MESSAGE.'26008',0),
26009 => array(DEFAULT_ERROR_MESSAGE.'26009',0),
26010 => array(DEFAULT_ERROR_MESSAGE.'26010',0),
26011 => array(DEFAULT_ERROR_MESSAGE.'26011',0),
26012 => array(DEFAULT_ERROR_MESSAGE.'26012',0),
26013 => array(DEFAULT_ERROR_MESSAGE.'26013',0),
26014 => array(DEFAULT_ERROR_MESSAGE.'26014',0),
26015 => array(DEFAULT_ERROR_MESSAGE.'26015',0),
26016 => array(DEFAULT_ERROR_MESSAGE.'26016',0),
 
27001 => array(DEFAULT_ERROR_MESSAGE.'27001',0),
27002 => array(DEFAULT_ERROR_MESSAGE.'27002',0),
27003 => array(DEFAULT_ERROR_MESSAGE.'27003',0),
27004 => array(DEFAULT_ERROR_MESSAGE.'27004',0),
27005 => array(DEFAULT_ERROR_MESSAGE.'27005',0),
27006 => array(DEFAULT_ERROR_MESSAGE.'27006',0),
27007 => array(DEFAULT_ERROR_MESSAGE.'27007',0),
27008 => array(DEFAULT_ERROR_MESSAGE.'27008',0),
27009 => array(DEFAULT_ERROR_MESSAGE.'27009',0),
27010 => array(DEFAULT_ERROR_MESSAGE.'27010',0),
27011 => array(DEFAULT_ERROR_MESSAGE.'27011',0),
27012 => array(DEFAULT_ERROR_MESSAGE.'27012',0),
27013 => array(DEFAULT_ERROR_MESSAGE.'27013',0),
27014 => array(DEFAULT_ERROR_MESSAGE.'27014',0),
27015 => array(DEFAULT_ERROR_MESSAGE.'27015',0),
 
28001 => array(DEFAULT_ERROR_MESSAGE.'28001',0),
28002 => array(DEFAULT_ERROR_MESSAGE.'28002',0),
28003 => array(DEFAULT_ERROR_MESSAGE.'28003',0),
28004 => array(DEFAULT_ERROR_MESSAGE.'28004',0),
28005 => array(DEFAULT_ERROR_MESSAGE.'28005',0),
28006 => array(DEFAULT_ERROR_MESSAGE.'28006',0),
28007 => array(DEFAULT_ERROR_MESSAGE.'28007',0),
 
29201 => array(DEFAULT_ERROR_MESSAGE.'28001',0),
29202 => array(DEFAULT_ERROR_MESSAGE.'28002',0),
29203 => array(DEFAULT_ERROR_MESSAGE.'28003',0),
29204 => array(DEFAULT_ERROR_MESSAGE.'28004',0),
29205 => array(DEFAULT_ERROR_MESSAGE.'28005',0),
29206 => array(DEFAULT_ERROR_MESSAGE.'28006',0),
29207 => array(DEFAULT_ERROR_MESSAGE.'28007',0),
29208 => array(DEFAULT_ERROR_MESSAGE.'28008',0),
29209 => array(DEFAULT_ERROR_MESSAGE.'28009',0),
29210 => array(DEFAULT_ERROR_MESSAGE.'28010',0),
 
);
 
?>
/trunk/composants/statistiques/lib/lang/de.inc.php
New file
0,0 → 1,542
<?php
/*=======================================================================
// File: DE.INC.PHP
// Description: German language file for error messages
// Created: 2006-03-06
// Author: Timo Leopold (timo@leopold-hh.de)
// Johan Persson (ljp@localhost.nil)
// Ver: $Id: de.inc.php 1886 2009-10-01 23:30:16Z ljp $
//
// Copyright (c)
//========================================================================
*/
 
// Notiz: Das Format fuer jede Fehlermeldung ist array(<Fehlermeldung>,<Anzahl der Argumente>)
$_jpg_messages = array(
 
/*
** Headers wurden bereits gesendet - Fehler. Dies wird als HTML formatiert, weil es direkt als text zurueckgesendet wird
*/
10 => array('<table border="1"><tr><td style="color:darkred;font-size:1.2em;"><b>JpGraph Fehler:</b>
HTTP header wurden bereits gesendet.<br>Fehler in der Datei <b>%s</b> in der Zeile <b>%d</b>.</td></tr><tr><td><b>Erklärung:</b><br>HTTP header wurden bereits zum Browser gesendet, wobei die Daten als Text gekennzeichnet wurden, bevor die Bibliothek die Chance hatte, seinen Bild-HTTP-Header zum Browser zu schicken. Dies verhindert, dass die Bibliothek Bilddaten zum Browser schicken kann (weil sie vom Browser als Text interpretiert würden und daher nur Mist dargestellt würde).<p>Wahrscheinlich steht Text im Skript bevor <i>Graph::Stroke()</i> aufgerufen wird. Wenn dieser Text zum Browser gesendet wird, nimmt dieser an, dass die gesamten Daten aus Text bestehen. Such nach irgendwelchem Text, auch nach Leerzeichen und Zeilenumbrüchen, die eventuell bereits zum Browser gesendet wurden. <p>Zum Beispiel ist ein oft auftretender Fehler, eine Leerzeile am Anfang der Datei oder vor <i>Graph::Stroke()</i> zu lassen."<b>&lt;?php</b>".</td></tr></table>',2),
 
/*
** Setup Fehler
*/
11 => array('Es wurde kein Pfad für CACHE_DIR angegeben. Bitte gib einen Pfad CACHE_DIR in der Datei jpg-config.inc an.',0),
12 => array('Es wurde kein Pfad für TTF_DIR angegeben und der Pfad kann nicht automatisch ermittelt werden. Bitte gib den Pfad in der Datei jpg-config.inc an.',0),
13 => array('The installed PHP version (%s) is not compatible with this release of the library. The library requires at least PHP version %s',2),
 
/*
** jpgraph_bar
*/
 
2001 => array('Die Anzahl der Farben ist nicht gleich der Anzahl der Vorlagen in BarPlot::SetPattern().',0),
2002 => array('Unbekannte Vorlage im Aufruf von BarPlot::SetPattern().',0),
2003 => array('Anzahl der X- und Y-Koordinaten sind nicht identisch. Anzahl der X-Koordinaten: %d; Anzahl der Y-Koordinaten: %d.',2),
2004 => array('Alle Werte für ein Balkendiagramm (barplot) müssen numerisch sein. Du hast den Wert nr [%d] == %s angegeben.',2),
2005 => array('Du hast einen leeren Vektor für die Schattierungsfarben im Balkendiagramm (barplot) angegeben.',0),
2006 => array('Unbekannte Position für die Werte der Balken: %s.',1),
2007 => array('Kann GroupBarPlot nicht aus einem leeren Vektor erzeugen.',0),
2008 => array('GroupBarPlot Element nbr %d wurde nicht definiert oder ist leer.',0),
2009 => array('Eins der Objekte, das an GroupBar weitergegeben wurde ist kein Balkendiagramm (BarPlot). Versichere Dich, dass Du den GroupBarPlot aus einem Vektor von Balkendiagrammen (barplot) oder AccBarPlot-Objekten erzeugst. (Class = %s)',1),
2010 => array('Kann AccBarPlot nicht aus einem leeren Vektor erzeugen.',0),
2011 => array('AccBarPlot-Element nbr %d wurde nicht definiert oder ist leer.',1),
2012 => array('Eins der Objekte, das an AccBar weitergegeben wurde ist kein Balkendiagramm (barplot). Versichere Dich, dass Du den AccBar-Plot aus einem Vektor von Balkendiagrammen (barplot) erzeugst. (Class=%s)',1),
2013 => array('Du hast einen leeren Vektor für die Schattierungsfarben im Balkendiagramm (barplot) angegeben.',0),
2014 => array('Die Anzahl der Datenpunkte jeder Datenreihe in AccBarPlot muss gleich sein.',0),
2015 => array('Individual bar plots in an AccBarPlot or GroupBarPlot can not have specified X-coordinates',0),
 
 
/*
** jpgraph_date
*/
 
3001 => array('Es ist nur möglich, entweder SetDateAlign() oder SetTimeAlign() zu benutzen, nicht beides!',0),
 
/*
** jpgraph_error
*/
 
4002 => array('Fehler bei den Eingabedaten von LineErrorPlot. Die Anzahl der Datenpunkte mus ein Mehrfaches von drei sein!',0),
 
/*
** jpgraph_flags
*/
 
5001 => array('Unbekannte Flaggen-Größe (%d).',1),
5002 => array('Der Flaggen-Index %s existiert nicht.',1),
5003 => array('Es wurde eine ungültige Ordnungszahl (%d) für den Flaggen-Index angegeben.',1),
5004 => array('Der Landesname %s hat kein korrespondierendes Flaggenbild. Die Flagge mag existieren, abr eventuell unter einem anderen Namen, z.B. versuche "united states" statt "usa".',1),
 
 
/*
** jpgraph_gantt
*/
 
6001 => array('Interner Fehler. Die Höhe für ActivityTitles ist < 0.',0),
6002 => array('Es dürfen keine negativen Werte für die Gantt-Diagramm-Dimensionen angegeben werden. Verwende 0, wenn die Dimensionen automatisch ermittelt werden sollen.',0),
6003 => array('Ungültiges Format für den Bedingungs-Parameter bei Index=%d in CreateSimple(). Der Parameter muss bei index 0 starten und Vektoren in der Form (Row,Constrain-To,Constrain-Type) enthalten.',1),
6004 => array('Ungültiges Format für den Fortschritts-Parameter bei Index=%d in CreateSimple(). Der Parameter muss bei Index 0 starten und Vektoren in der Form (Row,Progress) enthalten.',1),
6005 => array('SetScale() ist nicht sinnvoll bei Gantt-Diagrammen.',0),
6006 => array('Das Gantt-Diagramm kann nicht automatisch skaliert werden. Es existieren keine Aktivitäten mit Termin. [GetBarMinMax() start >= n]',0),
6007 => array('Plausibiltätsprüfung für die automatische Gantt-Diagramm-Größe schlug fehl. Entweder die Breite (=%d) oder die Höhe (=%d) ist größer als MAX_GANTTIMG_SIZE. Dies kann möglicherweise durch einen falschen Wert bei einer Aktivität hervorgerufen worden sein.',2),
6008 => array('Du hast eine Bedingung angegeben von Reihe=%d bis Reihe=%d, die keine Aktivität hat.',2),
6009 => array('Unbekannter Bedingungstyp von Reihe=%d bis Reihe=%d',2),
6010 => array('Ungültiger Icon-Index für das eingebaute Gantt-Icon [%d]',1),
6011 => array('Argument für IconImage muss entweder ein String oder ein Integer sein.',0),
6012 => array('Unbekannter Typ bei der Gantt-Objekt-Title-Definition.',0),
6015 => array('Ungültige vertikale Position %d',1),
6016 => array('Der eingegebene Datums-String (%s) für eine Gantt-Aktivität kann nicht interpretiert werden. Versichere Dich, dass es ein gültiger Datumsstring ist, z.B. 2005-04-23 13:30',1),
6017 => array('Unbekannter Datumstyp in GanttScale (%s).',1),
6018 => array('Intervall für Minuten muss ein gerader Teiler einer Stunde sein, z.B. 1,5,10,12,15,20,30, etc. Du hast ein Intervall von %d Minuten angegeben.',1),
6019 => array('Die vorhandene Breite (%d) für die Minuten ist zu klein, um angezeigt zu werden. Bitte benutze die automatische Größenermittlung oder vergrößere die Breite des Diagramms.',1),
6020 => array('Das Intervall für die Stunden muss ein gerader Teiler eines Tages sein, z.B. 0:30, 1:00, 1:30, 4:00, etc. Du hast ein Intervall von %d eingegeben.',1),
6021 => array('Unbekanntes Format für die Woche.',0),
6022 => array('Die Gantt-Skala wurde nicht eingegeben.',0),
6023 => array('Wenn Du sowohl Stunden als auch Minuten anzeigen lassen willst, muss das Stunden-Interval gleich 1 sein (anderenfalls ist es nicht sinnvoll, Minuten anzeigen zu lassen).',0),
6024 => array('Das CSIM-Ziel muss als String angegeben werden. Der Start des Ziels ist: %d',1),
6025 => array('Der CSIM-Alt-Text muss als String angegeben werden. Der Beginn des Alt-Textes ist: %d',1),
6027 => array('Der Fortschrittswert muss im Bereich [0, 1] liegen.',0),
6028 => array('Die eingegebene Höhe (%d) für GanttBar ist nicht im zulässigen Bereich.',1),
6029 => array('Der Offset für die vertikale Linie muss im Bereich [0,1] sein.',0),
6030 => array('Unbekannte Pfeilrichtung für eine Verbindung.',0),
6031 => array('Unbekannter Pfeiltyp für eine Verbindung.',0),
6032 => array('Interner Fehler: Unbekannter Pfadtyp (=%d) für eine Verbindung.',1),
6033 => array('Array of fonts must contain arrays with 3 elements, i.e. (Family, Style, Size)',0),
 
/*
** jpgraph_gradient
*/
 
7001 => array('Unbekannter Gradiententyp (=%d).',1),
 
/*
** jpgraph_iconplot
*/
 
8001 => array('Der Mix-Wert für das Icon muss zwischen 0 und 100 sein.',0),
8002 => array('Die Ankerposition für Icons muss entweder "top", "bottom", "left", "right" oder "center" sein.',0),
8003 => array('Es ist nicht möglich, gleichzeitig ein Bild und eine Landesflagge für dasselbe Icon zu definieren',0),
8004 => array('Wenn Du Landesflaggen benutzen willst, musst Du die Datei "jpgraph_flags.php" hinzufügen (per include).',0),
 
/*
** jpgraph_imgtrans
*/
 
9001 => array('Der Wert für die Bildtransformation ist außerhalb des zulässigen Bereichs. Der verschwindende Punkt am Horizont muss als Wert zwischen 0 und 1 angegeben werden.',0),
 
/*
** jpgraph_lineplot
*/
 
10001 => array('Die Methode LinePlot::SetFilled() sollte nicht mehr benutzt werden. Benutze lieber SetFillColor()',0),
10002 => array('Der Plot ist zu kompliziert für FastLineStroke. Benutze lieber den StandardStroke()',0),
10003 => array('Each plot in an accumulated lineplot must have the same number of data points.',0),
/*
** jpgraph_log
*/
 
11001 => array('Deine Daten enthalten nicht-numerische Werte.',0),
11002 => array('Negative Werte können nicht für logarithmische Achsen verwendet werden.',0),
11003 => array('Deine Daten enthalten nicht-numerische Werte.',0),
11004 => array('Skalierungsfehler für die logarithmische Achse. Es gibt ein Problem mit den Daten der Achse. Der größte Wert muss größer sein als Null. Es ist mathematisch nicht möglich, einen Wert gleich Null in der Skala zu haben.',0),
11005 => array('Das Tick-Intervall für die logarithmische Achse ist nicht definiert. Lösche jeden Aufruf von SetTextLabelStart() oder SetTextTickInterval() bei der logarithmischen Achse.',0),
 
/*
** jpgraph_mgraph
*/
 
12001 => array("Du benutzt GD 2.x und versuchst ein Nicht-Truecolor-Bild als Hintergrundbild zu benutzen. Um Hintergrundbilder mit GD 2.x zu benutzen, ist es notwendig Truecolor zu aktivieren, indem die USE_TRUECOLOR-Konstante auf TRUE gesetzt wird. Wegen eines Bugs in GD 2.0.1 ist die Qualität der Truetype-Schriften sehr schlecht, wenn man Truetype-Schriften mit Truecolor-Bildern verwendet.",0),
12002 => array('Ungültiger Dateiname für MGraph::SetBackgroundImage() : %s. Die Datei muss eine gültige Dateierweiterung haben (jpg,gif,png), wenn die automatische Typerkennung verwendet wird.',1),
12003 => array('Unbekannte Dateierweiterung (%s) in MGraph::SetBackgroundImage() für Dateiname: %s',2),
12004 => array('Das Bildformat des Hintergrundbildes (%s) wird von Deiner System-Konfiguration nicht unterstützt. ',1),
12005 => array('Das Hintergrundbild kann nicht gelesen werden: %s',1),
12006 => array('Es wurden ungültige Größen für Breite oder Höhe beim Erstellen des Bildes angegeben, (Breite=%d, Höhe=%d)',2),
12007 => array('Das Argument für MGraph::Add() ist nicht gültig für GD.',0),
12008 => array('Deine PHP- (und GD-lib-) Installation scheint keine bekannten Bildformate zu unterstützen.',0),
12009 => array('Deine PHP-Installation unterstützt das gewählte Bildformat nicht: %s',1),
12010 => array('Es konnte kein Bild als Datei %s erzeugt werden. Überprüfe, ob Du die entsprechenden Schreibrechte im aktuellen Verzeichnis hast.',1),
12011 => array('Es konnte kein Truecolor-Bild erzeugt werden. Überprüfe, ob Du wirklich die GD2-Bibliothek installiert hast.',0),
12012 => array('Es konnte kein Bild erzeugt werden. Überprüfe, ob Du wirklich die GD2-Bibliothek installiert hast.',0),
 
/*
** jpgraph_pie3d
*/
 
14001 => array('Pie3D::ShowBorder(). Missbilligte Funktion. Benutze Pie3D::SetEdge(), um die Ecken der Tortenstücke zu kontrollieren.',0),
14002 => array('PiePlot3D::SetAngle() 3D-Torten-Projektionswinkel muss zwischen 5 und 85 Grad sein.',0),
14003 => array('Interne Festlegung schlug fehl. Pie3D::Pie3DSlice',0),
14004 => array('Tortenstück-Startwinkel muss zwischen 0 und 360 Grad sein.',0),
14005 => array('Pie3D Interner Fehler: Versuch, zweimal zu umhüllen bei der Suche nach dem Startindex.',0,),
14006 => array('Pie3D Interner Fehler: Z-Sortier-Algorithmus für 3D-Tortendiagramme funktioniert nicht einwandfrei (2). Versuch, zweimal zu umhüllen beim Erstellen des Bildes.',0),
14007 => array('Die Breite für das 3D-Tortendiagramm ist 0. Gib eine Breite > 0 an.',0),
 
/*
** jpgraph_pie
*/
 
15001 => array('PiePLot::SetTheme() Unbekannter Stil: %s',1),
15002 => array('Argument für PiePlot::ExplodeSlice() muss ein Integer-Wert sein',0),
15003 => array('Argument für PiePlot::Explode() muss ein Vektor mit Integer-Werten sein.',0),
15004 => array('Tortenstück-Startwinkel muss zwischen 0 und 360 Grad sein.',0),
15005 => array('PiePlot::SetFont() sollte nicht mehr verwendet werden. Benutze stattdessen PiePlot->value->SetFont().',0),
15006 => array('PiePlot::SetSize() Radius für Tortendiagramm muss entweder als Bruch [0, 0.5] der Bildgröße oder als Absoluwert in Pixel im Bereich [10, 1000] angegeben werden.',0),
15007 => array('PiePlot::SetFontColor() sollte nicht mehr verwendet werden. Benutze stattdessen PiePlot->value->SetColor()..',0),
15008 => array('PiePlot::SetLabelType() der Typ für Tortendiagramme muss entweder 0 or 1 sein (nicht %d).',1),
15009 => array('Ungültiges Tortendiagramm. Die Summe aller Daten ist Null.',0),
15010 => array('Die Summe aller Daten ist Null.',0),
15011 => array('Um Bildtransformationen benutzen zu können, muss die Datei jpgraph_imgtrans.php eingefügt werden (per include).',0),
 
/*
** jpgraph_plotband
*/
 
16001 => array('Die Dichte für das Pattern muss zwischen 1 und 100 sein. (Du hast %f eingegeben)',1),
16002 => array('Es wurde keine Position für das Pattern angegeben.',0),
16003 => array('Unbekannte Pattern-Definition (%d)',0),
16004 => array('Der Mindeswert für das PlotBand ist größer als der Maximalwert. Bitte korrigiere dies!',0),
 
 
/*
** jpgraph_polar
*/
 
17001 => array('PolarPlots müssen eine gerade Anzahl von Datenpunkten haben. Jeder Datenpunkt ist ein Tupel (Winkel, Radius).',0),
17002 => array('Unbekannte Ausrichtung für X-Achsen-Titel. (%s)',1),
//17003 => array('Set90AndMargin() wird für PolarGraph nicht unterstützt.',0),
17004 => array('Unbekannter Achsentyp für PolarGraph. Er muss entweder \'lin\' oder \'log\' sein.',0),
 
/*
** jpgraph_radar
*/
 
18001 => array('ClientSideImageMaps werden für RadarPlots nicht unterstützt.',0),
18002 => array('RadarGraph::SupressTickMarks() sollte nicht mehr verwendet werden. Benutze stattdessen HideTickMarks().',0),
18003 => array('Ungültiger Achsentyp für RadarPlot (%s). Er muss entweder \'lin\' oder \'log\' sein.',1),
18004 => array('Die RadarPlot-Größe muss zwischen 0.1 und 1 sein. (Dein Wert=%f)',1),
18005 => array('RadarPlot: nicht unterstützte Tick-Dichte: %d',1),
18006 => array('Minimum Daten %f (RadarPlots sollten nur verwendet werden, wenn alle Datenpunkte einen Wert > 0 haben).',1),
18007 => array('Die Anzahl der Titel entspricht nicht der Anzahl der Datenpunkte.',0),
18008 => array('Jeder RadarPlot muss die gleiche Anzahl von Datenpunkten haben.',0),
 
/*
** jpgraph_regstat
*/
 
19001 => array('Spline: Anzahl der X- und Y-Koordinaten muss gleich sein.',0),
19002 => array('Ungültige Dateneingabe für Spline. Zwei oder mehr aufeinanderfolgende X-Werte sind identisch. Jeder eigegebene X-Wert muss unterschiedlich sein, weil vom mathematischen Standpunkt ein Eins-zu-Eins-Mapping vorliegen muss, d.h. jeder X-Wert korrespondiert mit exakt einem Y-Wert.',0),
19003 => array('Bezier: Anzahl der X- und Y-Koordinaten muss gleich sein.',0),
 
/*
** jpgraph_scatter
*/
 
20001 => array('Fieldplots müssen die gleiche Anzahl von X und Y Datenpunkten haben.',0),
20002 => array('Bei Fieldplots muss ein Winkel für jeden X und Y Datenpunkt angegeben werden.',0),
20003 => array('Scatterplots müssen die gleiche Anzahl von X- und Y-Datenpunkten haben.',0),
 
/*
** jpgraph_stock
*/
 
21001 => array('Die Anzahl der Datenwerte für Stock-Charts müssen ein Mehrfaches von %d Datenpunkten sein.',1),
 
/*
** jpgraph_plotmark
*/
 
23001 => array('Der Marker "%s" existiert nicht in der Farbe: %d',2),
23002 => array('Der Farb-Index ist zu hoch für den Marker "%s"',1),
23003 => array('Ein Dateiname muss angegeben werden, wenn Du den Marker-Typ auf MARK_IMG setzt.',0),
 
/*
** jpgraph_utils
*/
 
24001 => array('FuncGenerator : Keine Funktion definiert. ',0),
24002 => array('FuncGenerator : Syntax-Fehler in der Funktionsdefinition ',0),
24003 => array('DateScaleUtils: Unknown tick type specified in call to GetTicks()',0),
24004 => array('ReadCSV2: Die anzahl der spalten fehler in %s reihe %d',2),
/*
** jpgraph
*/
 
25001 => array('Diese PHP-Installation ist nicht mit der GD-Bibliothek kompiliert. Bitte kompiliere PHP mit GD-Unterstützung neu, damit JpGraph funktioniert. (Weder die Funktion imagetypes() noch imagecreatefromstring() existiert!)',0),
25002 => array('Diese PHP-Installation scheint nicht die benötigte GD-Bibliothek zu unterstützen. Bitte schau in der PHP-Dokumentation nach, wie man die GD-Bibliothek installiert und aktiviert.',0),
25003 => array('Genereller PHP Fehler : Bei %s:%d : %s',3),
25004 => array('Genereller PHP Fehler : %s ',1),
25005 => array('PHP_SELF, die PHP-Global-Variable kann nicht ermittelt werden. PHP kann nicht von der Kommandozeile gestartet werden, wenn der Cache oder die Bilddateien automatisch benannt werden sollen.',0),
25006 => array('Die Benutzung der FF_CHINESE (FF_BIG5) Schriftfamilie benötigt die iconv() Funktion in Deiner PHP-Konfiguration. Dies wird nicht defaultmäßig in PHP kompiliert (benötigt "--width-iconv" bei der Konfiguration).',0),
25007 => array('Du versuchst das lokale (%s) zu verwenden, was von Deiner PHP-Installation nicht unterstützt wird. Hinweis: Benutze \'\', um das defaultmäßige Lokale für diese geographische Region festzulegen.',1),
25008 => array('Die Bild-Breite und Höhe in Graph::Graph() müssen numerisch sein',0),
25009 => array('Die Skalierung der Achsen muss angegeben werden mit Graph::SetScale()',0),
 
25010 => array('Graph::Add() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0),
25011 => array('Graph::AddY2() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0),
25012 => array('Graph::AddYN() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0),
25013 => array('Es können nur Standard-Plots zu multiplen Y-Achsen hinzugefügt werden',0),
25014 => array('Graph::AddText() Du hast versucht, einen leeren Text zum Graph hinzuzufügen.',0),
25015 => array('Graph::AddLine() Du hast versucht, eine leere Linie zum Graph hinzuzufügen.',0),
25016 => array('Graph::AddBand() Du hast versucht, ein leeres Band zum Graph hinzuzufügen.',0),
25017 => array('Du benutzt GD 2.x und versuchst, ein Hintergrundbild in einem Truecolor-Bild zu verwenden. Um Hintergrundbilder mit GD 2.x zu verwenden, ist es notwendig, Truecolor zu aktivieren, indem die USE_TRUECOLOR-Konstante auf TRUE gesetzt wird. Wegen eines Bugs in GD 2.0.1 ist die Qualität der Schrift sehr schlecht, wenn Truetype-Schrift in Truecolor-Bildern verwendet werden.',0),
25018 => array('Falscher Dateiname für Graph::SetBackgroundImage() : "%s" muss eine gültige Dateinamenerweiterung (jpg,gif,png) haben, wenn die automatische Dateityperkennung verwenndet werden soll.',1),
25019 => array('Unbekannte Dateinamenerweiterung (%s) in Graph::SetBackgroundImage() für Dateiname: "%s"',2),
 
25020 => array('Graph::SetScale(): Dar Maximalwert muss größer sein als der Mindestwert.',0),
25021 => array('Unbekannte Achsendefinition für die Y-Achse. (%s)',1),
25022 => array('Unbekannte Achsendefinition für die X-Achse. (%s)',1),
25023 => array('Nicht unterstützter Y2-Achsentyp: "%s" muss einer von (lin,log,int) sein.',1),
25024 => array('Nicht unterstützter X-Achsentyp: "%s" muss einer von (lin,log,int) sein.',1),
25025 => array('Nicht unterstützte Tick-Dichte: %d',1),
25026 => array('Nicht unterstützter Typ der nicht angegebenen Y-Achse. Du hast entweder: 1. einen Y-Achsentyp für automatisches Skalieren definiert, aber keine Plots angegeben. 2. eine Achse direkt definiert, aber vergessen, die Tick-Dichte zu festzulegen.',0),
25027 => array('Kann cached CSIM "%s" zum Lesen nicht öffnen.',1),
25028 => array('Apache/PHP hat keine Schreibrechte, in das CSIM-Cache-Verzeichnis (%s) zu schreiben. Überprüfe die Rechte.',1),
25029 => array('Kann nicht in das CSIM "%s" schreiben. Überprüfe die Schreibrechte und den freien Speicherplatz.',1),
 
25030 => array('Fehlender Skriptname für StrokeCSIM(). Der Name des aktuellen Skriptes muss als erster Parameter von StrokeCSIM() angegeben werden.',0),
25031 => array('Der Achsentyp muss mittels Graph::SetScale() angegeben werden.',0),
25032 => array('Es existieren keine Plots für die Y-Achse nbr:%d',1),
25033 => array('',0),
25034 => array('Undefinierte X-Achse kann nicht gezeichnet werden. Es wurden keine Plots definiert.',0),
25035 => array('Du hast Clipping aktiviert. Clipping wird nur für Diagramme mit 0 oder 90 Grad Rotation unterstützt. Bitte verändere Deinen Rotationswinkel (=%d Grad) dementsprechend oder deaktiviere Clipping.',1),
25036 => array('Unbekannter Achsentyp AxisStyle() : %s',1),
25037 => array('Das Bildformat Deines Hintergrundbildes (%s) wird von Deiner System-Konfiguration nicht unterstützt. ',1),
25038 => array('Das Hintergrundbild scheint von einem anderen Typ (unterschiedliche Dateierweiterung) zu sein als der angegebene Typ. Angegebenen: %s; Datei: %s',2),
25039 => array('Hintergrundbild kann nicht gelesen werden: "%s"',1),
 
25040 => array('Es ist nicht möglich, sowohl ein Hintergrundbild als auch eine Hintergrund-Landesflagge anzugeben.',0),
25041 => array('Um Landesflaggen als Hintergrund benutzen zu können, muss die Datei "jpgraph_flags.php" eingefügt werden (per include).',0),
25042 => array('Unbekanntes Hintergrundbild-Layout',0),
25043 => array('Unbekannter Titelhintergrund-Stil.',0),
25044 => array('Automatisches Skalieren kann nicht verwendet werden, weil es unmöglich ist, einen gültigen min/max Wert für die Y-Achse zu ermitteln (nur Null-Werte).',0),
25045 => array('Die Schriftfamilien FF_HANDWRT und FF_BOOK sind wegen Copyright-Problemen nicht mehr verfügbar. Diese Schriften können nicht mehr mit JpGraph verteilt werden. Bitte lade Dir Schriften von http://corefonts.sourceforge.net/ herunter.',0),
25046 => array('Angegebene TTF-Schriftfamilie (id=%d) ist unbekannt oder existiert nicht. Bitte merke Dir, dass TTF-Schriften wegen Copyright-Problemen nicht mit JpGraph mitgeliefert werden. Du findest MS-TTF-Internetschriften (arial, courier, etc.) zum Herunterladen unter http://corefonts.sourceforge.net/',1),
25047 => array('Stil %s ist nicht verfügbar für Schriftfamilie %s',2),
25048 => array('Unbekannte Schriftstildefinition [%s].',1),
25049 => array('Schriftdatei "%s" ist nicht lesbar oder existiert nicht.',1),
 
25050 => array('Erstes Argument für Text::Text() muss ein String sein.',0),
25051 => array('Ungültige Richtung angegeben für Text.',0),
25052 => array('PANIK: Interner Fehler in SuperScript::Stroke(). Unbekannte vertikale Ausrichtung für Text.',0),
25053 => array('PANIK: Interner Fehler in SuperScript::Stroke(). Unbekannte horizontale Ausrichtung für Text.',0),
25054 => array('Interner Fehler: Unbekannte Grid-Achse %s',1),
25055 => array('Axis::SetTickDirection() sollte nicht mehr verwendet werden. Benutze stattdessen Axis::SetTickSide().',0),
25056 => array('SetTickLabelMargin() sollte nicht mehr verwendet werden. Benutze stattdessen Axis::SetLabelMargin().',0),
25057 => array('SetTextTicks() sollte nicht mehr verwendet werden. Benutze stattdessen SetTextTickInterval().',0),
25058 => array('TextLabelIntevall >= 1 muss angegeben werden.',0),
25059 => array('SetLabelPos() sollte nicht mehr verwendet werden. Benutze stattdessen Axis::SetLabelSide().',0),
 
25060 => array('Unbekannte Ausrichtung angegeben für X-Achsentitel (%s).',1),
25061 => array('Unbekannte Ausrichtung angegeben für Y-Achsentitel (%s).',1),
25062 => array('Label unter einem Winkel werden für die Y-Achse nicht unterstützt.',0),
25063 => array('Ticks::SetPrecision() sollte nicht mehr verwendet werden. Benutze stattdessen Ticks::SetLabelFormat() (oder Ticks::SetFormatCallback()).',0),
25064 => array('Kleinere oder größere Schrittgröße ist 0. Überprüfe, ob Du fälschlicherweise SetTextTicks(0) in Deinem Skript hast. Wenn dies nicht der Fall ist, bist Du eventuell über einen Bug in JpGraph gestolpert. Bitte sende einen Report und füge den Code an, der den Fehler verursacht hat.',0),
25065 => array('Tick-Positionen müssen als array() angegeben werden',0),
25066 => array('Wenn die Tick-Positionen und -Label von Hand eingegeben werden, muss die Anzahl der Ticks und der Label gleich sein.',0),
25067 => array('Deine von Hand eingegebene Achse und Ticks sind nicht korrekt. Die Skala scheint zu klein zu sein für den Tickabstand.',0),
25068 => array('Ein Plot hat eine ungültige Achse. Dies kann beispielsweise der Fall sein, wenn Du automatisches Text-Skalieren verwendest, um ein Liniendiagramm zu zeichnen mit nur einem Datenpunkt, oder wenn die Bildfläche zu klein ist. Es kann auch der Fall sein, dass kein Datenpunkt einen numerischen Wert hat (vielleicht nur \'-\' oder \'x\').',0),
25069 => array('Grace muss größer sein als 0',0),
 
25070 => array('Deine Daten enthalten nicht-numerische Werte.',0),
25071 => array('Du hast mit SetAutoMin() einen Mindestwert angegeben, der größer ist als der Maximalwert für die Achse. Dies ist nicht möglich.',0),
25072 => array('Du hast mit SetAutoMax() einen Maximalwert angegeben, der kleiner ist als der Minimalwert der Achse. Dies ist nicht möglich.',0),
25073 => array('Interner Fehler. Der Integer-Skalierungs-Algorithmus-Vergleich ist außerhalb der Grenzen (r=%f).',1),
25074 => array('Interner Fehler. Der Skalierungsbereich ist negativ (%f) [für %s Achse]. Dieses Problem könnte verursacht werden durch den Versuch, \'ungültige\' Werte in die Daten-Vektoren einzugeben (z.B. nur String- oder NULL-Werte), was beim automatischen Skalieren einen Fehler erzeugt.',2),
25075 => array('Die automatischen Ticks können nicht gesetzt werden, weil min==max.',0),
25077 => array('Einstellfaktor für die Farbe muss größer sein als 0',0),
25078 => array('Unbekannte Farbe: %s',1),
25079 => array('Unbekannte Farbdefinition: %s, Größe=%d',2),
 
25080 => array('Der Alpha-Parameter für Farben muss zwischen 0.0 und 1.0 liegen.',0),
25081 => array('Das ausgewählte Grafikformat wird entweder nicht unterstützt oder ist unbekannt [%s]',1),
25082 => array('Es wurden ungültige Größen für Breite und Höhe beim Erstellen des Bildes definiert (Breite=%d, Höhe=%d).',2),
25083 => array('Es wurde eine ungültige Größe beim Kopieren des Bildes angegeben. Die Größe für das kopierte Bild wurde auf 1 Pixel oder weniger gesetzt.',0),
25084 => array('Fehler beim Erstellen eines temporären GD-Canvas. Möglicherweise liegt ein Arbeitsspeicherproblem vor.',0),
25085 => array('Ein Bild kann nicht aus dem angegebenen String erzeugt werden. Er ist entweder in einem nicht unterstützen Format oder er represäntiert ein kaputtes Bild.',0),
25086 => array('Du scheinst nur GD 1.x installiert zu haben. Um Alphablending zu aktivieren, ist GD 2.x oder höher notwendig. Bitte installiere GD 2.x oder versichere Dich, dass die Konstante USE_GD2 richtig gesetzt ist. Standardmäßig wird die installierte GD-Version automatisch erkannt. Ganz selten wird GD2 erkannt, obwohl nur GD1 installiert ist. Die Konstante USE_GD2 muss dann zu "false" gesetzt werden.',0),
25087 => array('Diese PHP-Version wurde ohne TTF-Unterstützung konfiguriert. PHP muss mit TTF-Unterstützung neu kompiliert und installiert werden.',0),
25088 => array('Die GD-Schriftunterstützung wurde falsch konfiguriert. Der Aufruf von imagefontwidth() ist fehlerhaft.',0),
25089 => array('Die GD-Schriftunterstützung wurde falsch konfiguriert. Der Aufruf von imagefontheight() ist fehlerhaft.',0),
 
25090 => array('Unbekannte Richtung angegeben im Aufruf von StrokeBoxedText() [%s].',1),
25091 => array('Die interne Schrift untestützt das Schreiben von Text in einem beliebigen Winkel nicht. Benutze stattdessen TTF-Schriften.',0),
25092 => array('Es liegt entweder ein Konfigurationsproblem mit TrueType oder ein Problem beim Lesen der Schriftdatei "%s" vor. Versichere Dich, dass die Datei existiert und Leserechte und -pfad vergeben sind. (wenn \'basedir\' restriction in PHP aktiviert ist, muss die Schriftdatei im Dokumentwurzelverzeichnis abgelegt werden). Möglicherweise ist die FreeType-Bibliothek falsch installiert. Versuche, mindestens zur FreeType-Version 2.1.13 zu aktualisieren und kompiliere GD mit einem korrekten Setup neu, damit die FreeType-Bibliothek gefunden werden kann.',1),
25093 => array('Die Schriftdatei "%s" kann nicht gelesen werden beim Aufruf von Image::GetBBoxTTF. Bitte versichere Dich, dass die Schrift gesetzt wurde, bevor diese Methode aufgerufen wird, und dass die Schrift im TTF-Verzeichnis installiert ist.',1),
25094 => array('Die Textrichtung muss in einem Winkel zwischen 0 und 90 engegeben werden.',0),
25095 => array('Unbekannte Schriftfamilien-Definition. ',0),
25096 => array('Der Farbpalette können keine weiteren Farben zugewiesen werden. Dem Bild wurde bereits die größtmögliche Anzahl von Farben (%d) zugewiesen und die Palette ist voll. Verwende stattdessen ein TrueColor-Bild',0),
25097 => array('Eine Farbe wurde als leerer String im Aufruf von PushColor() angegegeben.',0),
25098 => array('Negativer Farbindex. Unpassender Aufruf von PopColor().',0),
25099 => array('Die Parameter für Helligkeit und Kontrast sind außerhalb des zulässigen Bereichs [-1,1]',0),
 
25100 => array('Es liegt ein Problem mit der Farbpalette und dem GD-Setup vor. Bitte deaktiviere anti-aliasing oder verwende GD2 mit TrueColor. Wenn die GD2-Bibliothek installiert ist, versichere Dich, dass die Konstante USE_GD2 auf "true" gesetzt und TrueColor aktiviert ist.',0),
25101 => array('Ungültiges numerisches Argument für SetLineStyle(): (%d)',1),
25102 => array('Ungültiges String-Argument für SetLineStyle(): %s',1),
25103 => array('Ungültiges Argument für SetLineStyle %s',1),
25104 => array('Unbekannter Linientyp: %s',1),
25105 => array('Es wurden NULL-Daten für ein gefülltes Polygon angegeben. Sorge dafür, dass keine NULL-Daten angegeben werden.',0),
25106 => array('Image::FillToBorder : es können keine weiteren Farben zugewiesen werden.',0),
25107 => array('In Datei "%s" kann nicht geschrieben werden. Überprüfe die aktuellen Schreibrechte.',1),
25108 => array('Das Bild kann nicht gestreamt werden. Möglicherweise liegt ein Fehler im PHP/GD-Setup vor. Kompiliere PHP neu und verwende die eingebaute GD-Bibliothek, die mit PHP angeboten wird.',0),
25109 => array('Deine PHP- (und GD-lib-) Installation scheint keine bekannten Grafikformate zu unterstützen. Sorge zunächst dafür, dass GD als PHP-Modul kompiliert ist. Wenn Du außerdem JPEG-Bilder verwenden willst, musst Du die JPEG-Bibliothek installieren. Weitere Details sind in der PHP-Dokumentation zu finden.',0),
 
25110 => array('Dein PHP-Installation unterstützt das gewählte Grafikformat nicht: %s',1),
25111 => array('Das gecachete Bild %s kann nicht gelöscht werden. Problem mit den Rechten?',1),
25112 => array('Das Datum der gecacheten Datei (%s) liegt in der Zukunft.',1),
25113 => array('Das gecachete Bild %s kann nicht gelöscht werden. Problem mit den Rechten?',1),
25114 => array('PHP hat nicht die erforderlichen Rechte, um in die Cache-Datei %s zu schreiben. Bitte versichere Dich, dass der Benutzer, der PHP anwendet, die entsprechenden Schreibrechte für die Datei hat, wenn Du das Cache-System in JPGraph verwenden willst.',1),
25115 => array('Berechtigung für gecachetes Bild %s kann nicht gesetzt werden. Problem mit den Rechten?',1),
25116 => array('Datei kann nicht aus dem Cache %s geöffnet werden',1),
25117 => array('Gecachetes Bild %s kann nicht zum Lesen geöffnet werden.',1),
25118 => array('Verzeichnis %s kann nicht angelegt werden. Versichere Dich, dass PHP die Schreibrechte in diesem Verzeichnis hat.',1),
25119 => array('Rechte für Datei %s können nicht gesetzt werden. Problem mit den Rechten?',1),
 
25120 => array('Die Position für die Legende muss als Prozentwert im Bereich 0-1 angegeben werden.',0),
25121 => array('Eine leerer Datenvektor wurde für den Plot eingegeben. Es muss wenigstens ein Datenpunkt vorliegen.',0),
25122 => array('Stroke() muss als Subklasse der Klasse Plot definiert sein.',0),
25123 => array('Du kannst keine Text-X-Achse mit X-Koordinaten verwenden. Benutze stattdessen eine "int" oder "lin" Achse.',0),
25124 => array('Der Eingabedatenvektor mus aufeinanderfolgende Werte von 0 aufwärts beinhalten. Der angegebene Y-Vektor beginnt mit leeren Werten (NULL).',0),
25125 => array('Ungültige Richtung für statische Linie.',0),
25126 => array('Es kann kein TrueColor-Bild erzeugt werden. Überprüfe, ob die GD2-Bibliothek und PHP korrekt aufgesetzt wurden.',0),
25127 => array('The library has been configured for automatic encoding conversion of Japanese fonts. This requires that PHP has the mb_convert_encoding() function. Your PHP installation lacks this function (PHP needs the "--enable-mbstring" when compiled).',0),
25128 => array('The function imageantialias() is not available in your PHP installation. Use the GD version that comes with PHP and not the standalone version.',0),
25129 => array('Anti-alias can not be used with dashed lines. Please disable anti-alias or use solid lines.',0),
25130 => array('Too small plot area. (%d x %d). With the given image size and margins there is to little space left for the plot. Increase the plot size or reduce the margins.',2),
 
25131 => array('StrokeBoxedText2() only supports TTF fonts and not built-in bitmap fonts.',0),
 
/*
** jpgraph_led
*/
 
25500 => array('Multibyte strings must be enabled in the PHP installation in order to run the LED module so that the function mb_strlen() is available. See PHP documentation for more information.',0),
 
 
/*
**---------------------------------------------------------------------------------------------
** Pro-version strings
**---------------------------------------------------------------------------------------------
*/
 
/*
** jpgraph_table
*/
 
27001 => array('GTextTable: Ungültiges Argument für Set(). Das Array-Argument muss 2-- dimensional sein.',0),
27002 => array('GTextTable: Ungültiges Argument für Set()',0),
27003 => array('GTextTable: Falsche Anzahl von Argumenten für GTextTable::SetColor()',0),
27004 => array('GTextTable: Angegebener Zellenbereich, der verschmolzen werden soll, ist ungültig.',0),
27005 => array('GTextTable: Bereits verschmolzene Zellen im Bereich (%d,%d) bis (%d,%d) können nicht ein weiteres Mal verschmolzen werden.',4),
27006 => array('GTextTable: Spalten-Argument = %d liegt außerhalb der festgelegten Tabellengröße.',1),
27007 => array('GTextTable: Zeilen-Argument = %d liegt außerhalb der festgelegten Tabellengröße.',1),
27008 => array('GTextTable: Spalten- und Zeilengröße müssen zu den Dimensionen der Tabelle passen.',0),
27009 => array('GTextTable: Die Anzahl der Tabellenspalten oder -zeilen ist 0. Versichere Dich, dass die Methoden Init() oder Set() aufgerufen werden.',0),
27010 => array('GTextTable: Es wurde keine Ausrichtung beim Aufruf von SetAlign() angegeben.',0),
27011 => array('GTextTable: Es wurde eine unbekannte Ausrichtung beim Aufruf von SetAlign() abgegeben. Horizontal=%s, Vertikal=%s',2),
27012 => array('GTextTable: Interner Fehler. Es wurde ein ungültiges Argument festgeleget %s',1),
27013 => array('GTextTable: Das Argument für FormatNumber() muss ein String sein.',0),
27014 => array('GTextTable: Die Tabelle wurde weder mit einem Aufruf von Set() noch von Init() initialisiert.',0),
27015 => array('GTextTable: Der Zellenbildbedingungstyp muss entweder TIMG_WIDTH oder TIMG_HEIGHT sein.',0),
 
/*
** jpgraph_windrose
*/
 
22001 => array('Die Gesamtsumme der prozentualen Anteile aller Windrosenarme darf 100%% nicht überschreiten!\n(Aktuell max: %d)',1),
22002 => array('Das Bild ist zu klein für eine Skala. Bitte vergrößere das Bild.',0),
22004 => array('Die Etikettendefinition für Windrosenrichtungen müssen 16 Werte haben (eine für jede Kompassrichtung).',0),
22005 => array('Der Linientyp für radiale Linien muss einer von ("solid","dotted","dashed","longdashed") sein.',0),
22006 => array('Es wurde ein ungültiger Windrosentyp angegeben.',0),
22007 => array('Es wurden zu wenig Werte für die Bereichslegende angegeben.',0),
22008 => array('Interner Fehler: Versuch, eine freie Windrose zu plotten, obwohl der Typ keine freie Windrose ist.',0),
22009 => array('Du hast die gleiche Richtung zweimal angegeben, einmal mit einem Winkel und einmal mit einer Kompassrichtung (%f Grad).',0),
22010 => array('Die Richtung muss entweder ein numerischer Wert sein oder eine der 16 Kompassrichtungen',0),
22011 => array('Der Windrosenindex muss ein numerischer oder Richtungswert sein. Du hast angegeben Index=%d',1),
22012 => array('Die radiale Achsendefinition für die Windrose enthält eine nicht aktivierte Richtung.',0),
22013 => array('Du hast dasselbe Look&Feel für die gleiche Kompassrichtung zweimal engegeben, einmal mit Text und einmal mit einem Index (Index=%d)',1),
22014 => array('Der Index für eine Kompassrichtung muss zwischen 0 und 15 sein.',0),
22015 => array('Du hast einen unbekannten Windrosenplottyp angegeben.',0),
22016 => array('Der Windrosenarmindex muss ein numerischer oder ein Richtungswert sein.',0),
22017 => array('Die Windrosendaten enthalten eine Richtung, die nicht aktiviert ist. Bitte berichtige, welche Label angezeigt werden sollen.',0),
22018 => array('Du hast für dieselbe Kompassrichtung zweimal Daten angegeben, einmal mit Text und einmal mit einem Index (Index=%d)',1),
22019 => array('Der Index für eine Richtung muss zwischen 0 und 15 sein. Winkel dürfen nicht für einen regelmäßigen Windplot angegeben werden, sondern entweder ein Index oder eine Kompassrichtung.',0),
22020 => array('Der Windrosenplot ist zu groß für die angegebene Bildgröße. Benutze entweder WindrosePlot::SetSize(), um den Plot kleiner zu machen oder vergrößere das Bild im ursprünglichen Aufruf von WindroseGraph().',0),
22021 => array('It is only possible to add Text, IconPlot or WindrosePlot to a Windrose Graph',0),
 
/*
** jpgraph_odometer
*/
 
13001 => array('Unbekannter Nadeltypstil (%d).',1),
13002 => array('Ein Wert für das Odometer (%f) ist außerhalb des angegebenen Bereichs [%f,%f]',3),
 
/*
** jpgraph_barcode
*/
 
1001 => array('Unbekannte Kodier-Specifikation: %s',1),
1002 => array('datenvalidierung schlug fehl. [%s] kann nicht mittels der Kodierung "%s" kodiert werden',2),
1003 => array('Interner Kodierfehler. Kodieren von %s ist nicht möglich in Code 128',1),
1004 => array('Interner barcode Fehler. Unbekannter UPC-E Kodiertyp: %s',1),
1005 => array('Interner Fehler. Das Textzeichen-Tupel (%s, %s) kann nicht im Code-128 Zeichensatz C kodiert werden.',2),
1006 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, CTRL in CHARSET != A zu kodieren.',0),
1007 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, DEL in CHARSET != B zu kodieren.',0),
1008 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, kleine Buchstaben in CHARSET != B zu kodieren.',0),
1009 => array('Kodieren mittels CODE 93 wird noch nicht unterstützt.',0),
1010 => array('Kodieren mittels POSTNET wird noch nicht unterstützt.',0),
1011 => array('Nicht untrstütztes Barcode-Backend für den Typ %s',1),
 
/*
** PDF417
*/
 
26000 => array('PDF417: The PDF417 module requires that the PHP installation must support the function bcmod(). This is normally enabled at compile time. See documentation for more information.',0),
26001 => array('PDF417: Die Anzahl der Spalten muss zwischen 1 und 30 sein.',0),
26002 => array('PDF417: Der Fehler-Level muss zwischen 0 und 8 sein.',0),
26003 => array('PDF417: Ungültiges Format für Eingabedaten, um sie mit PDF417 zu kodieren.',0),
26004 => array('PDF417: die eigebenen Daten können nicht mit Fehler-Level %d und %d spalten kodiert werden, weil daraus zu viele Symbole oder mehr als 90 Zeilen resultieren.',2),
26005 => array('PDF417: Die Datei "%s" kann nicht zum Schreiben geöffnet werden.',1),
26006 => array('PDF417: Interner Fehler. Die Eingabedatendatei für PDF417-Cluster %d ist fehlerhaft.',1),
26007 => array('PDF417: Interner Fehler. GetPattern: Ungültiger Code-Wert %d (Zeile %d)',2),
26008 => array('PDF417: Interner Fehler. Modus wurde nicht in der Modusliste!! Modus %d',1),
26009 => array('PDF417: Kodierfehler: Ungültiges Zeichen. Zeichen kann nicht mit ASCII-Code %d kodiert werden.',1),
26010 => array('PDF417: Interner Fehler: Keine Eingabedaten beim Dekodieren.',0),
26011 => array('PDF417: Kodierfehler. Numerisches Kodieren bei nicht-numerischen Daten nicht möglich.',0),
26012 => array('PDF417: Interner Fehler. Es wurden für den Binary-Kompressor keine Daten zum Dekodieren eingegeben.',0),
26013 => array('PDF417: Interner Fehler. Checksum Fehler. Koeffiziententabellen sind fehlerhaft.',0),
26014 => array('PDF417: Interner Fehler. Es wurden keine Daten zum Berechnen von Kodewörtern eingegeben.',0),
26015 => array('PDF417: Interner Fehler. Ein Eintrag 0 in die Statusübertragungstabellen ist nicht NULL. Eintrag 1 = (%s)',1),
26016 => array('PDF417: Interner Fehler: Nichtregistrierter Statusübertragungsmodus beim Dekodieren.',0),
 
 
/*
** jpgraph_contour
*/
 
28001 => array('Dritten parameter fur Contour muss ein vector der fargen sind.',0),
28002 => array('Die anzahlen der farges jeder isobar linien muss gleich sein.',0),
28003 => array('ContourPlot Interner Fehler: isobarHCrossing: Spalten index ist zu hoch (%d)',1),
28004 => array('ContourPlot Interner Fehler: isobarHCrossing: Reihe index ist zu hoch (%d)',1),
28005 => array('ContourPlot Interner Fehler: isobarVCrossing: Reihe index ist zu hoch (%d)',1),
28006 => array('ContourPlot Interner Fehler: isobarVCrossing: Spalten index ist zu hoch (%d)',1),
28007 => array('ContourPlot. Interpolation faktor ist zu hoch (>5)',0),
 
 
/*
* jpgraph_matrix and colormap
*/
29201 => array('Min range value must be less or equal to max range value for colormaps',0),
29202 => array('The distance between min and max value is too small for numerical precision',0),
29203 => array('Number of color quantification level must be at least %d',1),
29204 => array('Number of colors (%d) is invalid for this colormap. It must be a number that can be written as: %d + k*%d',3),
29205 => array('Colormap specification out of range. Must be an integer in range [0,%d]',1),
29206 => array('Invalid object added to MatrixGraph',0),
29207 => array('Empty input data specified for MatrixPlot',0),
29208 => array('Unknown side specifiction for matrix labels "%s"',1),
29209 => array('CSIM Target matrix must be the same size as the data matrix (csim=%d x %d, data=%d x %d)',4),
29210 => array('CSIM Target for matrix labels does not match the number of labels (csim=%d, labels=%d)',2),
 
);
 
?>
/trunk/composants/statistiques/lib/contour_dev/tri-quad.php
New file
0,0 → 1,790
<?php
require_once '../jpgraph.php';
require_once '../jpgraph_canvas.php';
require_once '../jpgraph_canvtools.php';
 
 
class ContCanvas {
public $g;
public $shape,$scale;
function __construct($xmax=5,$ymax=5,$width=350,$height=350) {
 
$this->g = new CanvasGraph($width,$height);
$this->scale = new CanvasScale($this->g, 0, $xmax, 0, $ymax);
$this->shape = new Shape($this->g, $this->scale);
 
//$this->g->SetFrame(true);
$this->g->SetMargin(2,2,2,2);
$this->g->SetMarginColor('white@1');
$this->g->InitFrame();
}
 
function StrokeGrid() {
list($xmin,$xmax,$ymin,$ymax) = $this->scale->Get();
$this->shape->SetColor('gray');
for( $col=1; $col<$xmax; ++$col ) {
$this->shape->Line($col, 0, $col, $ymax);
}
for( $row=1; $row<$ymax; ++$row ) {
$this->shape->Line(0, $row, $xmax, $row);
}
}
 
function SetDatapoints($datapoints) {
$ny=count($datapoints);
$nx=count($datapoints[0]);
$t = new Text();
$t->SetFont(FF_ARIAL,FS_NORMAL,8);
for( $x=0; $x < $nx; ++$x ) {
for( $y=0; $y < $ny; ++$y ) {
list($x1,$y1) = $this->scale->Translate($x,$y);
 
if( $datapoints[$y][$x] > 0 )
$t->SetColor('blue');
else
$t->SetColor('black');
$t->SetFont(FF_ARIAL,FS_BOLD,8);
$t->Set($datapoints[$y][$x]);
$t->Stroke($this->g->img,$x1,$y1);
 
$t->SetColor('gray');
$t->SetFont(FF_ARIAL,FS_NORMAL,8);
$t->Set("($y,$x)");
$t->Stroke($this->g->img,$x1+10,$y1);
 
}
}
}
 
function DrawLinePolygons($p,$color='red') {
$this->shape->SetColor($color);
for ($i = 0 ; $i < count($p) ; $i++) {
$x1 = $p[$i][0][0]; $y1 = $p[$i][0][1];
for ($j = 1 ; $j < count($p[$i]) ; $j++) {
$x2=$p[$i][$j][0]; $y2 = $p[$i][$j][1];
$this->shape->Line($x1, $y1, $x2, $y2);
$x1=$x2; $y1=$y2;
}
}
}
 
function Line($x1,$y1,$x2,$y2,$color='red') {
$this->shape->SetColor($color);
$this->shape->Line($x1, $y1, $x2, $y2);
}
function Polygon($p,$color='blue') {
$this->shape->SetColor($color);
$this->shape->Polygon($p);
}
 
function FilledPolygon($p,$color='lightblue') {
$this->shape->SetColor($color);
$this->shape->FilledPolygon($p);
}
 
function Point($x,$y,$color) {
list($x1,$y1) = $this->scale->Translate($x, $y);
$this->shape->SetColor($color);
$this->g->img->Point($x1,$y1);
}
 
function Stroke() {
$this->g->Stroke();
}
 
}
 
// Calculate the area for a simple polygon. This will not work for
// non-simple polygons, i.e. self crossing.
function polygonArea($aX, $aY) {
$n = count($aX);
$area = 0 ;
$j = 0 ;
for ($i=0; $i < $n; $i++) {
$j++;
if ( $j == $n) {
$j=0;
}
$area += ($aX[i]+$aX[j])*($aY[i]-$aY[j]);
}
return area*.5;
}
 
class SingleTestTriangle {
const contval=5;
static $maxdepth=2;
static $cnt=0;
static $t;
public $g;
public $shape,$scale;
public $cont = array(2,4,5);
public $contcolors = array('yellow','purple','seagreen','green','lightblue','blue','teal','orange','red','darkred','brown');
public $dofill=false;
public $showtriangulation=false,$triangulation_color="lightgray";
public $showannotation=false;
public $contlinecolor='black',$showcontlines=true;
private $labels = array(), $showlabels=false;
private $labelColor='black',$labelFF=FF_ARIAL,$labelFS=FS_BOLD,$labelFSize=9;
 
function __construct($width,$height,$nx,$ny) {
$xmax=$nx+0.1;$ymax=$ny+0.1;
$this->g = new CanvasGraph($width,$height);
$this->scale = new CanvasScale($this->g, -0.1, $xmax, -0.1, $ymax);
$this->shape = new Shape($this->g, $this->scale);
 
//$this->g->SetFrame(true);
$this->g->SetMargin(2,2,2,2);
$this->g->SetMarginColor('white@1');
//$this->g->InitFrame();
 
self::$t = new Text();
self::$t->SetColor('black');
self::$t->SetFont(FF_ARIAL,FS_BOLD,9);
self::$t->SetAlign('center','center');
}
 
function getPlotSize() {
return array($this->g->img->width,$this->g->img->height);
}
 
function SetContours($c) {
$this->cont = $c;
}
 
function ShowLabels($aFlg=true) {
$this->showlabels = $aFlg;
}
 
function ShowLines($aFlg=true) {
$this->showcontlines=$aFlg;
}
 
function SetFilled($f=true) {
$this->dofill = $f;
}
 
function ShowTriangulation($f=true) {
$this->showtriangulation = $f;
}
 
function Stroke() {
$this->g->Stroke();
}
 
function FillPolygon($color,&$p) {
self::$cnt++;
if( $this->dofill ) {
$this->shape->SetColor($color);
$this->shape->FilledPolygon($p);
}
if( $this->showtriangulation ) {
$this->shape->SetColor($this->triangulation_color);
$this->shape->Polygon($p);
}
}
function GetNextHigherContourIdx($val) {
for( $i=0; $i < count($this->cont); ++$i ) {
if( $val < $this->cont[$i] ) return $i;
}
return count($this->cont);
}
 
function GetContVal($v1) {
for( $i=0; $i < count($this->cont); ++$i ) {
if( $this->cont[$i] > $v1 ) {
return $this->cont[$i];
}
}
die('No contour value is larger or equal than : '.$v1);
}
function GetColor($v) {
return $this->contcolors[$this->GetNextHigherContourIdx($v)];
}
 
function storeAnnotation($x1,$y1,$v1,$angle) {
$this->labels[$this->GetNextHigherContourIdx($v1)][] = array($x1,$y1,$v1,$angle);
}
 
function labelProx($x1,$y1,$v1) {
 
list($w,$h) = $this->getPlotSize();
 
 
if( $x1 < 20 || $x1 > $w-20 )
return true;
 
if( $y1 < 20 || $y1 > $h-20 )
return true;
if( !isset ($this->labels[$this->GetNextHigherContourIdx($v1)]) ) {
return false;
}
$p = $this->labels[$this->GetNextHigherContourIdx($v1)];
$n = count($p);
$d = 999999;
for ($i = 0 ; $i < $n ; $i++) {
$xp = $p[$i][0];
$yp = $p[$i][1];
$d = min($d, ($x1-$xp)*($x1-$xp) + ($y1-$yp)*($y1-$yp));
}
$limit = $w*$h/9;
$limit = max(min($limit,20000),3500);
if( $d < $limit ) return true;
else return false;
}
 
function putLabel($x1,$y1,$x2,$y2,$v1) {
 
$angle = 0;
if( $x2 - $x1 != 0 ) {
$grad = ($y2-$y1)/($x2-$x1);
$angle = -(atan($grad) * 180/M_PI);
self::$t->SetAngle($angle);
}
 
$x = $this->scale->TranslateX($x1);
$y = $this->scale->TranslateY($y1);
if( !$this->labelProx($x, $y, $v1) ) {
$this->storeAnnotation($x, $y, $v1, $angle);
}
}
 
function strokeLabels() {
$t = new Text();
$t->SetColor($this->labelColor);
$t->SetFont($this->labelFF,$this->labelFS,$this->labelFSize);
$t->SetAlign('center','center');
 
foreach ($this->labels as $cont_idx => $pos) {
if( $cont_idx >= 10 ) return;
foreach ($pos as $idx => $coord) {
$t->Set( sprintf("%.1f",$coord[2]) );
$t->SetAngle($coord[3]);
$t->Stroke($this->g->img,$coord[0],$coord[1]);
}
}
}
 
function annotate($x1,$y1,$x2,$y2,$x1p,$y1p,$v1,$v2,$v1p) {
if( !$this->showannotation ) return;
/*
$this->g->img->SetColor('green');
$this->g->img->FilledCircle($this->scale->TranslateX($x1),$this->scale->TranslateY($y1), 4);
$this->g->img->FilledCircle($this->scale->TranslateX($x2),$this->scale->TranslateY($y2), 4);
 
$this->g->img->SetColor('red');
$this->g->img->FilledCircle($this->scale->TranslateX($x1p),$this->scale->TranslateY($y1p), 4);
*/
//self::$t->Set(sprintf("%.1f",$v1,$this->VC($v1)));
//self::$t->Stroke($this->g->img,$this->scale->TranslateX($x1),$this->scale->TranslateY($y1));
//self::$t->Set(sprintf("%.1f",$v2,$this->VC($v2)));
//self::$t->Stroke($this->g->img,$this->scale->TranslateX($x2),$this->scale->TranslateY($y2));
 
$x = $this->scale->TranslateX($x1p);
$y = $this->scale->TranslateY($y1p);
if( !$this->labelProx($x, $y, $v1p) ) {
$this->storeAnnotation($x, $y, $v1p);
self::$t->Set(sprintf("%.1f",$v1p,$this->VC($v1p)));
self::$t->Stroke($this->g->img,$x,$y);
}
}
 
function Pertubate(&$v1,&$v2,&$v3,&$v4) {
$pert = 0.9999;
$n = count($this->cont);
for($i=0; $i < $n; ++$i) {
if( $v1==$this->cont[$i] ) {
$v1 *= $pert;
break;
}
}
for($i=0; $i < $n; ++$i) {
if( $v2==$this->cont[$i] ) {
$v2 *= $pert;
break;
}
}
for($i=0; $i < $n; ++$i) {
if( $v3==$this->cont[$i] ) {
$v3 *= $pert;
break;
}
}
for($i=0; $i < $n; ++$i) {
if( $v4==$this->cont[$i] ) {
$v4 *= $pert;
break;
}
}
}
 
function interp2($x1,$y1,$x2,$y2,$v1,$v2) {
$cv = $this->GetContVal(min($v1,$v2));
$alpha = ($v1-$cv)/($v1-$v2);
$x1p = $x1*(1-$alpha) + $x2*$alpha;
$y1p = $y1*(1-$alpha) + $y2*$alpha;
$v1p = $v1 + $alpha*($v2-$v1);
return array($x1p,$y1p,$v1p);
}
 
function RectFill($v1,$v2,$v3,$v4,$x1,$y1,$x2,$y2,$x3,$y3,$x4,$y4,$depth) {
if( $depth >= self::$maxdepth ) {
// Abort and just appoximate the color of this area
// with the average of the three values
$color = $this->GetColor(($v1+$v2+$v3+$v4)/4);
$p = array($x1, $y1, $x2, $y2, $x3, $y3, $x4, $y4, $x1, $y1);
$this->FillPolygon($color,$p) ;
}
else {
 
$this->Pertubate($v1,$v2,$v3,$v4);
 
$fcnt = 0 ;
$vv1 = $this->GetNextHigherContourIdx($v1);
$vv2 = $this->GetNextHigherContourIdx($v2);
$vv3 = $this->GetNextHigherContourIdx($v3);
$vv4 = $this->GetNextHigherContourIdx($v4);
$eps = 0.0001;
 
if( $vv1 == $vv2 && $vv2 == $vv3 && $vv3 == $vv4 ) {
$color = $this->GetColor($v1);
$p = array($x1, $y1, $x2, $y2, $x3, $y3, $x4, $y4, $x1, $y1);
$this->FillPolygon($color,$p) ;
}
else {
 
$dv1 = abs($vv1-$vv2);
$dv2 = abs($vv2-$vv3);
$dv3 = abs($vv3-$vv4);
$dv4 = abs($vv1-$vv4);
if( $dv1 == 1 ) {
list($x1p,$y1p,$v1p) = $this->interp2($x1,$y1,$x2,$y2,$v1,$v2);
$fcnt++;
}
if( $dv2 == 1 ) {
list($x2p,$y2p,$v2p) = $this->interp2($x2,$y2,$x3,$y3,$v2,$v3);
$fcnt++;
}
if( $dv3 == 1 ) {
list($x3p,$y3p,$v3p) = $this->interp2($x3,$y3,$x4,$y4,$v3,$v4);
$fcnt++;
}
 
if( $dv4 == 1 ) {
list($x4p,$y4p,$v4p) = $this->interp2($x4,$y4,$x1,$y1,$v4,$v1);
$fcnt++;
}
 
$totdv = $dv1 + $dv2 + $dv3 + $dv4 ;
if( ($fcnt == 2 && $totdv==2) || ($fcnt == 4 && $totdv==4) ) {
 
if( $fcnt == 2 && $totdv==2 ) {
 
if( $dv1 == 1 && $dv2 == 1) {
$color1 = $this->GetColor($v2);
$p1 = array($x1p,$y1p,$x2,$y2,$x2p,$y2p,$x1p,$y1p);
$color2 = $this->GetColor($v4);
$p2 = array($x1,$y1,$x1p,$y1p,$x2p,$y2p,$x3,$y3,$x4,$y4,$x1,$y1);
 
$color = $this->GetColor($v1p);
$p = array($x1p,$y1p,$x2p,$y2p);
$v = $v1p;
}
elseif( $dv1 == 1 && $dv3 == 1 ) {
$color1 = $this->GetColor($v2);
$p1 = array($x1p,$y1p,$x2,$y2,$x3,$y3,$x3p,$y3p,$x1p,$y1p);
$color2 = $this->GetColor($v4);
$p2 = array($x1,$y1,$x1p,$y1p,$x3p,$y3p,$x4,$y4,$x1,$y1);
 
$color = $this->GetColor($v1p);
$p = array($x1p,$y1p,$x3p,$y3p);
$v = $v1p;
}
elseif( $dv1 == 1 && $dv4 == 1 ) {
$color1 = $this->GetColor($v1);
$p1 = array($x1,$y1,$x1p,$y1p,$x4p,$y4p,$x1,$y1);
$color2 = $this->GetColor($v3);
$p2 = array($x1p,$y1p,$x2,$y2,$x3,$y3,$x4,$y4,$x4p,$y4p,$x1p,$y1p);
 
$color = $this->GetColor($v1p);
$p = array($x1p,$y1p,$x4p,$y4p);
$v = $v1p;
}
elseif( $dv2 == 1 && $dv4 == 1 ) {
$color1 = $this->GetColor($v1);
$p1 = array($x1,$y1,$x2,$y2,$x2p,$y2p,$x4p,$y4p,$x1,$y1);
$color2 = $this->GetColor($v3);
$p2 = array($x4p,$y4p,$x2p,$y2p,$x3,$y3,$x4,$y4,$x4p,$y4p);
 
$color = $this->GetColor($v2p);
$p = array($x2p,$y2p,$x4p,$y4p);
$v = $v2p;
}
elseif( $dv2 == 1 && $dv3 == 1 ) {
$color1 = $this->GetColor($v1);
$p1 = array($x1,$y1,$x2,$y2,$x2p,$y2p,$x3p,$y3p,$x4,$y4,$x1,$y1);
$color2 = $this->GetColor($v3);
$p2 = array($x2p,$y2p,$x3,$y3,$x3p,$y3p,$x2p,$y2p);
 
$color = $this->GetColor($v2p);
$p = array($x2p,$y2p,$x3p,$y3p);
$v = $v2p;
}
elseif( $dv3 == 1 && $dv4 == 1 ) {
$color1 = $this->GetColor($v1);
$p1 = array($x1,$y1,$x2,$y2,$x3,$y3,$x3p,$y3p,$x4p,$y4p,$x1,$y1);
$color2 = $this->GetColor($v4);
$p2 = array($x4p,$y4p,$x3p,$y3p,$x4,$y4,$x4p,$y4p);
 
$color = $this->GetColor($v4p);
$p = array($x4p,$y4p,$x3p,$y3p);
$v = $v4p;
}
 
$this->FillPolygon($color1,$p1);
$this->FillPolygon($color2,$p2);
 
if( $this->showcontlines ) {
if( $this->dofill ) {
$this->shape->SetColor($this->contlinecolor);
}
else {
$this->shape->SetColor($color);
}
$this->shape->Line($p[0],$p[1],$p[2],$p[3]);
}
if( $this->showlabels ) {
$this->putLabel( ($p[0]+$p[2])/2, ($p[1]+$p[3])/2, $p[2],$p[3] , $v);
}
}
elseif( $fcnt == 4 && $totdv==4 ) {
$vc = ($v1+$v2+$v3+$v4)/4;
 
if( $v1p == $v2p && $v2p == $v3p && $v3p == $v4p ) {
// Four edge crossings (saddle point) of the same contour
// so we first need to
// find out how the saddle is crossing "/" or "\"
 
if( $this->GetNextHigherContourIdx($vc) == $this->GetNextHigherContourIdx($v1) ) {
// "\"
$color1 = $this->GetColor($v1);
$p1 = array($x1,$y1,$x1p,$y1p,$x4p,$y4p,$x1,$y1);
 
$color2 = $this->GetColor($v2);
$p2 = array($x1p,$y1p,$x2,$y2,$x2p,$y2p,$x3p,$y3p,$x4,$y4,$x4p,$y4p,$x1p,$y1p);
 
$color3 = $color1;
$p3 = array($x2p,$y2p,$x3,$y3,$x3p,$y3p,$x2p,$y2p);
 
$colorl1 = $this->GetColor($v1p);
$pl1 = array($x1p,$y1p,$x4p,$y4p);
$colorl2 = $this->GetColor($v2p);
$pl2 = array($x2p,$y2p,$x3p,$y3p);
$vl1 = $v1p; $vl2 = $v2p;
 
}
else {
// "/"
$color1 = $this->GetColor($v2);
$p1 = array($x1p,$y1p,$x2,$y2,$x2p,$y2p,$x1p,$y1p);
 
$color2 = $this->GetColor($v3);
$p2 = array($x1p,$y1p,$x2p,$y2p,$x3,$y3,$x3p,$y3p,$x4p,$y4p,$x1,$y1,$x1p,$y1p);
 
$color3 = $color1;
$p3 = array($x4p,$y4p,$x3p,$y3p,$x4,$y4,$x4p,$y4p);
 
$colorl1 = $this->GetColor($v1p);
$pl1 = array($x1p,$y1p,$x2p,$y2p);
$colorl2 = $this->GetColor($v4p);
$pl2 = array($x4p,$y4p,$x3p,$y3p);
$vl1 = $v1p; $vl2 = $v4p;
}
}
else {
// There are two different contours crossing so we need to find
// out which belongs to which
if( $v1p == $v2p ) {
// "/"
$color1 = $this->GetColor($v2);
$p1 = array($x1p,$y1p,$x2,$y2,$x2p,$y2p,$x1p,$y1p);
 
$color2 = $this->GetColor($v3);
$p2 = array($x1p,$y1p,$x2p,$y2p,$x3,$y3,$x3p,$y3p,$x4p,$y4p,$x1,$y1,$x1p,$y1p);
 
$color3 = $this->GetColor($v4);
$p3 = array($x4p,$y4p,$x3p,$y3p,$x4,$y4,$x4p,$y4p);
 
$colorl1 = $this->GetColor($v1p);
$pl1 = array($x1p,$y1p,$x2p,$y2p);
$colorl2 = $this->GetColor($v4p);
$pl2 = array($x4p,$y4p,$x3p,$y3p);
$vl1 = $v1p; $vl2 = $v4p;
}
else { //( $v1p == $v4p )
// "\"
$color1 = $this->GetColor($v1);
$p1 = array($x1,$y1,$x1p,$y1p,$x4p,$y4p,$x1,$y1);
 
$color2 = $this->GetColor($v2);
$p2 = array($x1p,$y1p,$x2,$y2,$x2p,$y2p,$x3p,$y3p,$x4,$y4,$x4p,$y4p,$x1p,$y1p);
 
$color3 = $this->GetColor($v3);
$p3 = array($x2p,$y2p,$x3,$y3,$x3p,$y3p,$x2p,$y2p);
 
$colorl1 = $this->GetColor($v1p);
$pl1 = array($x1p,$y1p,$x4p,$y4p);
$colorl2 = $this->GetColor($v2p);
$pl2 = array($x2p,$y2p,$x3p,$y3p);
$vl1 = $v1p; $vl2 = $v2p;
}
}
$this->FillPolygon($color1,$p1);
$this->FillPolygon($color2,$p2);
$this->FillPolygon($color3,$p3);
 
if( $this->showcontlines ) {
if( $this->dofill ) {
$this->shape->SetColor($this->contlinecolor);
$this->shape->Line($pl1[0],$pl1[1],$pl1[2],$pl1[3]);
$this->shape->Line($pl2[0],$pl2[1],$pl2[2],$pl2[3]);
}
else {
$this->shape->SetColor($colorl1);
$this->shape->Line($pl1[0],$pl1[1],$pl1[2],$pl1[3]);
$this->shape->SetColor($colorl2);
$this->shape->Line($pl2[0],$pl2[1],$pl2[2],$pl2[3]);
}
}
if( $this->showlabels ) {
$this->putLabel( ($pl1[0]+$pl1[2])/2, ($pl1[1]+$pl1[3])/2, $pl1[2], $pl1[3], $vl1);
$this->putLabel( ($pl2[0]+$pl2[2])/2, ($pl2[1]+$pl2[3])/2, $pl2[2], $pl2[3],$vl2);
}
}
}
else {
$vc = ($v1+$v2+$v3+$v4)/4;
$xc = ($x1+$x4)/2;
$yc = ($y1+$y2)/2;
 
// Top left
$this->RectFill(($v1+$v2)/2, $v2, ($v2+$v3)/2, $vc,
$x1,$yc, $x2,$y2, $xc,$y2, $xc,$yc, $depth+1);
// Top right
$this->RectFill($vc, ($v2+$v3)/2, $v3, ($v3+$v4)/2,
$xc,$yc, $xc,$y2, $x3,$y3, $x3,$yc, $depth+1);
 
// Bottom left
$this->RectFill($v1, ($v1+$v2)/2, $vc, ($v1+$v4)/2,
$x1,$y1, $x1,$yc, $xc,$yc, $xc,$y4, $depth+1);
 
// Bottom right
$this->RectFill(($v1+$v4)/2, $vc, ($v3+$v4)/2, $v4,
$xc,$y1, $xc,$yc, $x3,$yc, $x4,$y4, $depth+1);
 
}
}
}
}
 
function TriFill($v1,$v2,$v3,$x1,$y1,$x2,$y2,$x3,$y3,$depth) {
if( $depth >= self::$maxdepth ) {
// Abort and just appoximate the color of this area
// with the average of the three values
$color = $this->GetColor(($v1+$v2+$v3)/3);
$p = array($x1, $y1, $x2, $y2, $x3, $y3, $x1, $y1);
$this->FillPolygon($color,$p) ;
}
else {
// In order to avoid some real unpleasentness in case a vertice is exactly
// the same value as a contour we pertuberate them so that we do not end up
// in udefined situation. This will only affect the calculations and not the
// visual appearance
 
$dummy=0;
$this->Pertubate($v1,$v2,$v3,$dummy);
 
$fcnt = 0 ;
$vv1 = $this->GetNextHigherContourIdx($v1);
$vv2 = $this->GetNextHigherContourIdx($v2);
$vv3 = $this->GetNextHigherContourIdx($v3);
$eps = 0.0001;
 
if( $vv1 == $vv2 && $vv2 == $vv3 ) {
$color = $this->GetColor($v1);
$p = array($x1, $y1, $x2, $y2, $x3, $y3, $x1, $y1);
$this->FillPolygon($color,$p) ;
}
else {
$dv1 = abs($vv1-$vv2);
$dv2 = abs($vv2-$vv3);
$dv3 = abs($vv1-$vv3);
 
if( $dv1 == 1 ) {
list($x1p,$y1p,$v1p) = $this->interp2($x1,$y1,$x2,$y2,$v1,$v2);
$fcnt++;
}
else {
$x1p = ($x1+$x2)/2;
$y1p = ($y1+$y2)/2;
$v1p = ($v1+$v2)/2;
}
 
if( $dv2 == 1 ) {
list($x2p,$y2p,$v2p) = $this->interp2($x2,$y2,$x3,$y3,$v2,$v3);
$fcnt++;
}
else {
$x2p = ($x2+$x3)/2;
$y2p = ($y2+$y3)/2;
$v2p = ($v2+$v3)/2;
}
 
if( $dv3 == 1 ) {
list($x3p,$y3p,$v3p) = $this->interp2($x3,$y3,$x1,$y1,$v3,$v1);
$fcnt++;
}
else {
$x3p = ($x3+$x1)/2;
$y3p = ($y3+$y1)/2;
$v3p = ($v3+$v1)/2;
}
 
if( $fcnt == 2 &&
((abs($v1p-$v2p) < $eps && $dv1 ==1 && $dv2==1 ) ||
(abs($v1p-$v3p) < $eps && $dv1 ==1 && $dv3==1 ) ||
(abs($v2p-$v3p) < $eps && $dv2 ==1 && $dv3==1 )) ) {
 
// This means that the contour line crosses exactly two sides
// and that the values of each vertice is such that only this
// contour line will cross this section.
// We can now be smart. The cotour line will simply divide the
// area in two polygons that we can fill and then return. There is no
// need to recurse.
// First find out which two sides the contour is crossing
if( abs($v1p-$v2p) < $eps ) {
$p4 = array($x1,$y1,$x1p,$y1p,$x2p,$y2p,$x3,$y3,$x1,$y1);
$color4 = $this->GetColor($v1);
$p3 = array($x1p,$y1p,$x2,$y2,$x2p,$y2p,$x1p,$y1p);
$color3 = $this->GetColor($v2);
 
$p = array($x1p,$y1p,$x2p,$y2p);
$color = $this->GetColor($v1p);
$v = $v1p;
}
elseif( abs($v1p-$v3p) < $eps ) {
$p4 = array($x1p,$y1p,$x2,$y2,$x3,$y3,$x3p,$y3p,$x1p,$y1p);
$color4 = $this->GetColor($v2);
$p3 = array($x1,$y1,$x1p,$y1p,$x3p,$y3p,$x1,$y1);
$color3 = $this->GetColor($v1);
 
$p = array($x1p,$y1p,$x3p,$y3p);
$color = $this->GetColor($v1p);
$v = $v1p;
}
else {
$p4 = array($x1,$y1,$x2,$y2,$x2p,$y2p,$x3p,$y3p,$x1,$y1);
$color4 = $this->GetColor($v2);
 
$p3 = array($x3p,$y3p,$x2p,$y2p,$x3,$y3,$x3p,$y3p);
$color3 = $this->GetColor($v3);
 
$p = array($x3p,$y3p,$x2p,$y2p);
$color = $this->GetColor($v3p);
$v = $v3p;
}
$this->FillPolygon($color4,$p4);
$this->FillPolygon($color3,$p3);
 
if( $this->showcontlines ) {
if( $this->dofill ) {
$this->shape->SetColor($this->contlinecolor);
}
else {
$this->shape->SetColor($color);
}
$this->shape->Line($p[0],$p[1],$p[2],$p[3]);
}
if( $this->showlabels ) {
$this->putLabel( ($p[0]+$p[2])/2, ($p[1]+$p[3])/2, $p[2], $p[3], $v);
}
}
else {
$this->TriFill($v1, $v1p, $v3p, $x1, $y1, $x1p, $y1p, $x3p, $y3p, $depth+1);
$this->TriFill($v1p, $v2, $v2p, $x1p, $y1p, $x2, $y2, $x2p, $y2p, $depth+1);
$this->TriFill($v3p, $v1p, $v2p, $x3p, $y3p, $x1p, $y1p, $x2p, $y2p, $depth+1);
$this->TriFill($v3p, $v2p, $v3, $x3p, $y3p, $x2p, $y2p, $x3, $y3, $depth+1);
}
}
}
}
 
function Fill($v1,$v2,$v3,$maxdepth) {
$x1=0; $y1=1;
$x2=1; $y2=0;
$x3=1; $y3=1;
self::$maxdepth = $maxdepth;
$this->TriFill($v1, $v2, $v3, $x1, $y1, $x2, $y2, $x3, $y3, 0);
}
 
function Fillmesh($meshdata,$maxdepth,$method='tri') {
$nx = count($meshdata[0]);
$ny = count($meshdata);
self::$maxdepth = $maxdepth;
for( $x=0; $x < $nx-1; ++$x ) {
for( $y=0; $y < $ny-1; ++$y ) {
$v1 = $meshdata[$y][$x];
$v2 = $meshdata[$y][$x+1];
$v3 = $meshdata[$y+1][$x+1];
$v4 = $meshdata[$y+1][$x];
 
if( $method == 'tri' ) {
// Fill upper and lower triangle
$this->TriFill($v4, $v1, $v2, $x, $y+1, $x, $y, $x+1, $y, 0);
$this->TriFill($v4, $v2, $v3, $x, $y+1, $x+1, $y, $x+1, $y+1, 0);
}
else {
$this->RectFill($v4, $v1, $v2, $v3, $x, $y+1, $x, $y, $x+1, $y, $x+1, $y+1, 0);
}
}
}
if( $this->showlabels ) {
$this->strokeLabels();
}
}
}
 
$meshdata = array(
array (12,12,10,10),
array (10,10,8,14),
array (7,7,13,17),
array (4,5,8,12),
array (10,8,7,8));
 
$tt = new SingleTestTriangle(400,400,count($meshdata[0])-1,count($meshdata)-1);
$tt->SetContours(array(4.7, 6.0, 7.2, 8.6, 9.9, 11.2, 12.5, 13.8, 15.1, 16.4));
$tt->SetFilled(true);
 
//$tt->ShowTriangulation(true);
$tt->ShowLines(true);
 
//$tt->ShowLabels(true);
$tt->Fillmesh($meshdata, 8, 'rect');
 
//$tt->Fill(4.0,3.0,7.0, 4);
//$tt->Fill(7,4,1,5);
//$tt->Fill(1,7,4,5);
 
$tt->Stroke();
 
?>
/trunk/composants/statistiques/lib/contour_dev/findpolygon.php
New file
0,0 → 1,798
<?php
require_once '../jpgraph.php';
require_once '../jpgraph_canvas.php';
require_once '../jpgraph_canvtools.php';
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
 
/**
* Description of test_findpolygon
*
* @author ljp
*/
class Findpolygon {
private $nbrContours=-1;
public $contourCoord=array();
private $scale = array(0,6,0,8);
 
function flattenEdges($p) {
$fp=array();
for ($i = 0 ; $i < count($p) ; $i++) {
$fp[] = $p[$i][0];
$fp[] = $p[$i][1];
}
return $fp;
}
 
function SetupTestData() {
// for($i=0; $i<count($this->contourCoord[0]); ++$i) {
// echo '('.$this->contourCoord[0][$i][0][0].','.$this->contourCoord[0][$i][0][1].') -> '.
// '('.$this->contourCoord[0][$i][1][0].','.$this->contourCoord[0][$i][1][1].")\n";
// }
//
 
$c=0;
$p[$c] = array(0.6,1, 1,0.5, 2,0.5, 3,0.5, 3.5,1, 3.5,2, 3,2.5, 2,2.5, 1,2.5, 0.5,2, 0.6,1);
$c++;
$p[$c] = array(6,0.5, 5.5,1, 5.5,2, 6,2.5);
 
$this->nbrContours = $c+1;
 
for ($c = 0 ; $c < count($p) ; $c++) {
$n=count($p[$c]);
 
$this->contourCoord[$c][0] = array(array($p[$c][0],$p[$c][1]),array($p[$c][2],$p[$c][3]));
$k=1;
for ($i = 0; $i < ($n-4)/2; $i++, $k++) {
$this->contourCoord[$c][$k] = array($this->contourCoord[$c][$k-1][1], array($p[$c][2*$k+2],$p[$c][2*$k+1+2]));
}
 
// Swap edges order at random
$n = count($this->contourCoord[$c]);
for($i=0; $i < floor($n/2); ++$i) {
$swap1 = rand(0,$n-1);
$t = $this->contourCoord[$c][$swap1];
while( $swap1 == ($swap2 = rand(0,$n-1)) )
;
$this->contourCoord[$c][$swap1] = $this->contourCoord[$c][$swap2];
$this->contourCoord[$c][$swap2] = $t;
}
 
// Swap vector direction on 1/3 of the edges
for ($i = 0 ; $i < floor(count($this->contourCoord[$c])/3) ; $i++) {
$e = rand(0, count($this->contourCoord[$c])-1);
$edge = $this->contourCoord[$c][$e];
$v1 = $edge[0]; $v2 = $edge[1];
$this->contourCoord[$c][$e][0] = $v2;
$this->contourCoord[$c][$e][1] = $v1;
}
}
 
$pp = array();
for($j=0; $j < count($p); ++$j ) {
for( $i=0; $i < count($p[$j])/2; ++$i ) {
$pp[$j][$i] = array($p[$j][2*$i],$p[$j][2*$i+1]);
}
}
return $pp;
}
 
function p_edges($v) {
for ($i = 0 ; $i < count($v) ; $i++) {
echo "(".$v[$i][0][0].",".$v[$i][0][1].") -> (".$v[$i][1][0].",".$v[$i][1][1].")\n";
}
echo "\n";
}
 
function CompareCyclic($a,$b,$forward=true) {
 
// We assume disjoint vertices and if last==first this just means
// that the polygon is closed. For this comparison it must be unique
// elements
if( $a[count($a)-1] == $a[0] ) {
array_pop($a);
}
if( $b[count($b)-1] == $b[0] ) {
array_pop($b);
}
 
$n1 = count($a); $n2 = count($b);
if( $n1 != $n2 )
return false;
 
$i=0;
while( ($i < $n2) && ($a[0] != $b[$i]) )
++$i;
 
if( $i >= $n2 )
return false;
 
$j=0;
if( $forward ) {
while( ($j < $n1) && ($a[$j] == $b[$i]) ) {
$i = ($i + 1) % $n2;
++$j;
}
}
else {
while( ($j < $n1) && ($a[$j] == $b[$i]) ) {
--$i;
if( $i < 0 ) {
$i = $n2-1;
}
++$j;
}
}
return $j >= $n1;
}
 
function dbg($s) {
// echo $s."\n";
}
 
function IsVerticeOnBorder($x1,$y1) {
// Check if the vertice lies on any of the four border
if( $x1==$this->scale[0] || $x1==$this->scale[1] ) {
return true;
}
if( $y1==$this->scale[2] || $y1==$this->scale[3] ) {
return true;
}
return false;
}
 
function FindPolygons($debug=false) {
 
$pol = 0;
for ($c = 0; $c < $this->nbrContours; $c++) {
 
$this->dbg("\n** Searching polygon chain $c ... ");
$this->dbg("------------------------------------------\n");
 
$edges = $this->contourCoord[$c];
while( count($edges) > 0 ) {
 
$edge = array_shift($edges);
list($x1,$y1) = $edge[0];
list($x2,$y2) = $edge[1];
$polygons[$pol]=array(
array($x1,$y1),array($x2,$y2)
);
 
$this->dbg("Searching on second vertice.");
 
$found=false;
if( ! $this->IsVerticeOnBorder($x2,$y2) ) {
do {
 
$this->dbg(" --Searching on edge: ($x1,$y1)->($x2,$y2)");
 
$found=false;
$nn = count($edges);
for( $i=0; $i < $nn && !$found; ++$i ) {
$edge = $edges[$i];
if( $found = ($x2==$edge[0][0] && $y2==$edge[0][1]) ) {
$polygons[$pol][] = array($edge[1][0],$edge[1][1]);
$x1 = $x2; $y1 = $y2;
$x2 = $edge[1][0]; $y2 = $edge[1][1];
}
elseif( $found = ($x2==$edge[1][0] && $y2==$edge[1][1]) ) {
$polygons[$pol][] = array($edge[0][0],$edge[0][1]);
$x1 = $x2; $y1 = $y2;
$x2 = $edge[0][0]; $y2 = $edge[0][1];
}
if( $found ) {
$this->dbg(" --Found next edge: [i=$i], (%,%) -> ($x2,$y2)");
unset($edges[$i]);
$edges = array_values($edges);
}
}
 
} while( $found );
}
 
if( !$found && count($edges)>0 ) {
$this->dbg("Searching on first vertice.");
list($x1,$y1) = $polygons[$pol][0];
list($x2,$y2) = $polygons[$pol][1];
 
if( ! $this->IsVerticeOnBorder($x1,$y1) ) {
do {
 
$this->dbg(" --Searching on edge: ($x1,$y1)->($x2,$y2)");
 
$found=false;
$nn = count($edges);
for( $i=0; $i < $nn && !$found; ++$i ) {
$edge = $edges[$i];
if( $found = ($x1==$edge[0][0] && $y1==$edge[0][1]) ) {
array_unshift($polygons[$pol],array($edge[1][0],$edge[1][1]));
$x2 = $x1; $y2 = $y1;
$x1 = $edge[1][0]; $y1 = $edge[1][1];
}
elseif( $found = ($x1==$edge[1][0] && $y1==$edge[1][1]) ) {
array_unshift($polygons[$pol],array($edge[0][0],$edge[0][1]));
$x2 = $x1; $y2 = $y1;
$x1 = $edge[0][0]; $y1 = $edge[0][1];
}
if( $found ) {
$this->dbg(" --Found next edge: [i=$i], ($x1,$y1) -> (%,%)");
unset($edges[$i]);
$edges = array_values($edges);
}
}
 
} while( $found );
}
 
}
 
$pol++;
}
}
 
return $polygons;
}
 
}
define('HORIZ_EDGE',0);
define('VERT_EDGE',1);
 
class FillGridRect {
private $edges,$dataPoints,$colors,$isoBars;
private $invert=false;
 
function __construct(&$edges,&$dataPoints,$isoBars,$colors) {
$this->edges = $edges;
$this->dataPoints = $dataPoints;
$this->colors = $colors;
$this->isoBars = $isoBars;
}
 
function GetIsobarColor($val) {
for ($i = 0 ; $i < count($this->isoBars) ; $i++) {
if( $val <= $this->isoBars[$i] ) {
return $this->colors[$i];
}
}
return $this->colors[$i]; // The color for all values above the highest isobar
}
 
function GetIsobarVal($a,$b) {
// Get the isobar that is between the values a and b
// If there are more isobars then return the one with lowest index
if( $b < $a ) {
$t=$a; $a=$b; $b=$t;
}
$i = 0 ;
$n = count($this->isoBars);
while( $i < $n && $this->isoBars[$i] < $a ) {
++$i;
}
if( $i >= $n )
die("Internal error. Cannot find isobar values for ($a,$b)");
return $this->isoBars[$i];
}
 
function getCrossingCoord($aRow,$aCol,$aEdgeDir,$aIsobarVal) {
// In order to avoid numerical problem when two vertices are very close
// we have to check and avoid dividing by close to zero denumerator.
if( $aEdgeDir == HORIZ_EDGE ) {
$d = abs($this->dataPoints[$aRow][$aCol] - $this->dataPoints[$aRow][$aCol+1]);
if( $d > 0.001 ) {
$xcoord = $aCol + abs($aIsobarVal - $this->dataPoints[$aRow][$aCol]) / $d;
}
else {
$xcoord = $aCol;
}
$ycoord = $aRow;
}
else {
$d = abs($this->dataPoints[$aRow][$aCol] - $this->dataPoints[$aRow+1][$aCol]);
if( $d > 0.001 ) {
$ycoord = $aRow + abs($aIsobarVal - $this->dataPoints[$aRow][$aCol]) / $d;
}
else {
$ycoord = $aRow;
}
$xcoord = $aCol;
}
if( $this->invert ) {
$ycoord = $this->nbrRows-1 - $ycoord;
}
return array($xcoord,$ycoord);
}
 
function Fill(ContCanvas $canvas) {
 
$nx_vertices = count($this->dataPoints[0]);
$ny_vertices = count($this->dataPoints);
 
// Loop through all squares in the grid
for($col=0; $col < $nx_vertices-1; ++$col) {
for($row=0; $row < $ny_vertices-1; ++$row) {
 
$n = 0;$quad_edges=array();
if ( $this->edges[VERT_EDGE][$row][$col] ) $quad_edges[$n++] = array($row, $col, VERT_EDGE);
if ( $this->edges[VERT_EDGE][$row][$col+1] ) $quad_edges[$n++] = array($row, $col+1,VERT_EDGE);
if ( $this->edges[HORIZ_EDGE][$row][$col] ) $quad_edges[$n++] = array($row, $col, HORIZ_EDGE);
if ( $this->edges[HORIZ_EDGE][$row+1][$col] ) $quad_edges[$n++] = array($row+1,$col, HORIZ_EDGE);
 
if( $n == 0 ) {
// Easy, fill the entire quadrant with one color since we have no crossings
// Select the top left datapoint as representing this quadrant
// color for this quadrant
$color = $this->GetIsobarColor($this->dataPoints[$row][$col]);
$polygon = array($col,$row,$col,$row+1,$col+1,$row+1,$col+1,$row,$col,$row);
$canvas->FilledPolygon($polygon,$color);
 
} elseif( $n==2 ) {
 
// There is one isobar edge crossing this quadrant. In order to fill we need to
// find out the orientation of the two areas this edge is separating in order to
// construct the two polygons that define the two areas to be filled
// There are six possible variants
// 0) North-South
// 1) West-East
// 2) West-North
// 3) East-North
// 4) West-South
// 5) East-South
$type=-1;
if( $this->edges[HORIZ_EDGE][$row][$col] ) {
if( $this->edges[HORIZ_EDGE][$row+1][$col] ) $type=0; // North-South
elseif( $this->edges[VERT_EDGE][$row][$col] ) $type=2;
elseif( $this->edges[VERT_EDGE][$row][$col+1] ) $type=3;
}
elseif( $this->edges[HORIZ_EDGE][$row+1][$col] ) {
if( $this->edges[VERT_EDGE][$row][$col] ) $type=4;
elseif( $this->edges[VERT_EDGE][$row][$col+1] ) $type=5;
}
else {
$type=1;
}
if( $type==-1 ) {
die('Internal error: n=2 but no edges in the quadrant was find to determine type.');
}
 
switch( $type ) {
case 0: //North-South
 
// North vertice
$v1 = $this->dataPoints[$row][$col];
$v2 = $this->dataPoints[$row][$col+1];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x1,$y1) = $this->getCrossingCoord($row, $col,HORIZ_EDGE, $isobarValue);
 
// South vertice
$v1 = $this->dataPoints[$row+1][$col];
$v2 = $this->dataPoints[$row+1][$col+1];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x2,$y2) = $this->getCrossingCoord($row+1, $col,HORIZ_EDGE, $isobarValue);
 
$polygon = array($col,$row,$x1,$y1,$x2,$y2,$col,$row+1,$col,$row);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v1));
 
$polygon = array($col+1,$row,$x1,$y1,$x2,$y2,$col+1,$row+1,$col+1,$row);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v2));
 
break;
 
case 1: // West-East
 
// West vertice
$v1 = $this->dataPoints[$row][$col];
$v2 = $this->dataPoints[$row+1][$col];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x1,$y1) = $this->getCrossingCoord($row, $col,VERT_EDGE, $isobarValue);
 
// East vertice
$v1 = $this->dataPoints[$row][$col+1];
$v2 = $this->dataPoints[$row+1][$col+1];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x2,$y2) = $this->getCrossingCoord($row, $col+1,VERT_EDGE, $isobarValue);
 
$polygon = array($col,$row,$x1,$y1,$x2,$y2,$col+1,$row,$col,$row);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v1));
 
$polygon = array($col,$row+1,$x1,$y1,$x2,$y2,$col+1,$row+1,$col,$row+1);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v2));
break;
 
case 2: // West-North
 
// West vertice
$v1 = $this->dataPoints[$row][$col];
$v2 = $this->dataPoints[$row+1][$col];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x1,$y1) = $this->getCrossingCoord($row, $col,VERT_EDGE, $isobarValue);
 
// North vertice
$v1 = $this->dataPoints[$row][$col];
$v2 = $this->dataPoints[$row][$col+1];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x2,$y2) = $this->getCrossingCoord($row, $col,HORIZ_EDGE, $isobarValue);
 
$polygon = array($col,$row,$x1,$y1,$x2,$y2,$col,$row);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v1));
 
$polygon = array($x1,$y1,$x2,$y2,$col+1,$row,$col+1,$row+1,$col,$row+1,$x1,$y1);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v2));
 
break;
 
case 3: // East-North
 
// if( $row==3 && $col==1 && $n==2 ) {
// echo " ** East-North<br>";
// }
 
 
// East vertice
$v1 = $this->dataPoints[$row][$col+1];
$v2 = $this->dataPoints[$row+1][$col+1];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x1,$y1) = $this->getCrossingCoord($row, $col+1,VERT_EDGE, $isobarValue);
//
// if( $row==3 && $col==1 && $n==2 ) {
// echo " ** E_val($v1,$v2), isobar=$isobarValue<br>";
// echo " ** E($x1,$y1)<br>";
// }
 
 
// North vertice
$v1 = $this->dataPoints[$row][$col];
$v2 = $this->dataPoints[$row][$col+1];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x2,$y2) = $this->getCrossingCoord($row, $col,HORIZ_EDGE, $isobarValue);
 
// if( $row==3 && $col==1 && $n==2 ) {
// echo " ** N_val($v1,$v2), isobar=$isobarValue<br>";
// echo " ** N($x2,$y2)<br>";
// }
// if( $row==3 && $col==1 && $n==2 )
// $canvas->Line($x1,$y1,$x2,$y2,'blue');
 
$polygon = array($x1,$y1,$x2,$y2,$col+1,$row,$x1,$y1);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v2));
 
$polygon = array($col,$row,$x2,$y2,$x1,$y1,$col+1,$row+1,$col,$row+1,$col,$row);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v1));
 
break;
 
case 4: // West-South
 
// West vertice
$v1 = $this->dataPoints[$row][$col];
$v2 = $this->dataPoints[$row+1][$col];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x1,$y1) = $this->getCrossingCoord($row, $col,VERT_EDGE, $isobarValue);
 
// South vertice
$v1 = $this->dataPoints[$row+1][$col];
$v2 = $this->dataPoints[$row+1][$col+1];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x2,$y2) = $this->getCrossingCoord($row+1, $col,HORIZ_EDGE, $isobarValue);
 
$polygon = array($col,$row+1,$x1,$y1,$x2,$y2,$col,$row+1);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v1));
 
$polygon = array($x1,$y1,$x2,$y2,$col+1,$row+1,$col+1,$row,$col,$row,$x1,$y1);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v2));
 
break;
 
case 5: // East-South
 
//
// if( $row==1 && $col==1 && $n==2 ) {
// echo " ** Sout-East<br>";
// }
 
// East vertice
$v1 = $this->dataPoints[$row][$col+1];
$v2 = $this->dataPoints[$row+1][$col+1];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x1,$y1) = $this->getCrossingCoord($row, $col+1,VERT_EDGE, $isobarValue);
 
// if( $row==1 && $col==1 && $n==2 ) {
// echo " ** E_val($v1,$v2), isobar=$isobarValue<br>";
// echo " ** E($x1,$y1)<br>";
// }
 
// South vertice
$v1 = $this->dataPoints[$row+1][$col];
$v2 = $this->dataPoints[$row+1][$col+1];
$isobarValue = $this->GetIsobarVal($v1, $v2);
list($x2,$y2) = $this->getCrossingCoord($row+1, $col,HORIZ_EDGE, $isobarValue);
 
// if( $row==1 && $col==1 && $n==2 ) {
// echo " ** S_val($v1,$v2), isobar=$isobarValue<br>";
// echo " ** S($x2,$y2)<br>";
// }
 
$polygon = array($col+1,$row+1,$x1,$y1,$x2,$y2,$col+1,$row+1);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v2));
 
$polygon = array($x1,$y1,$x2,$y2,$col,$row+1,$col,$row,$col+1,$row,$x1,$y1);
$canvas->FilledPolygon($polygon,$this->GetIsobarColor($v1));
 
break;
 
}
 
}
 
}
}
 
}
}
 
 
class ContCanvas {
public $g;
public $shape,$scale;
function __construct($xmax=6,$ymax=6,$width=400,$height=400) {
 
$this->g = new CanvasGraph($width,$height);
$this->scale = new CanvasScale($this->g, 0, $xmax, 0, $ymax);
$this->shape = new Shape($this->g, $this->scale);
 
//$this->g->SetFrame(true);
$this->g->SetMargin(5,5,5,5);
$this->g->SetMarginColor('white@1');
$this->g->InitFrame();
 
 
$this->shape->SetColor('gray');
for( $col=1; $col<$xmax; ++$col ) {
$this->shape->Line($col, 0, $col, $ymax);
}
for( $row=1; $row<$ymax; ++$row ) {
$this->shape->Line(0, $row, $xmax, $row);
}
}
 
function SetDatapoints($datapoints) {
$ny=count($datapoints);
$nx=count($datapoints[0]);
$t = new Text();
$t->SetFont(FF_ARIAL,FS_NORMAL,8);
for( $x=0; $x < $nx; ++$x ) {
for( $y=0; $y < $ny; ++$y ) {
list($x1,$y1) = $this->scale->Translate($x,$y);
 
if( $datapoints[$y][$x] > 0 )
$t->SetColor('blue');
else
$t->SetColor('black');
$t->SetFont(FF_ARIAL,FS_BOLD,8);
$t->Set($datapoints[$y][$x]);
$t->Stroke($this->g->img,$x1,$y1);
 
$t->SetColor('gray');
$t->SetFont(FF_ARIAL,FS_NORMAL,8);
$t->Set("($y,$x)");
$t->Stroke($this->g->img,$x1+10,$y1);
 
}
}
}
 
function DrawLinePolygons($p,$color='red') {
$this->shape->SetColor($color);
for ($i = 0 ; $i < count($p) ; $i++) {
$x1 = $p[$i][0][0]; $y1 = $p[$i][0][1];
for ($j = 1 ; $j < count($p[$i]) ; $j++) {
$x2=$p[$i][$j][0]; $y2 = $p[$i][$j][1];
$this->shape->Line($x1, $y1, $x2, $y2);
$x1=$x2; $y1=$y2;
}
}
}
 
function Line($x1,$y1,$x2,$y2,$color='red') {
$this->shape->SetColor($color);
$this->shape->Line($x1, $y1, $x2, $y2);
}
function Polygon($p,$color='blue') {
$this->shape->SetColor($color);
$this->shape->Polygon($p);
}
 
function FilledPolygon($p,$color='lightblue') {
$this->shape->SetColor($color);
$this->shape->FilledPolygon($p);
}
 
function Point($x,$y,$color) {
list($x1,$y1) = $this->scale->Translate($x, $y);
$this->shape->SetColor($color);
$this->g->img->Point($x1,$y1);
}
 
function Stroke() {
$this->g->Stroke();
}
 
}
 
 
class PixelFill {
 
private $edges,$dataPoints,$colors,$isoBars;
 
function __construct(&$edges,&$dataPoints,$isoBars,$colors) {
$this->edges = $edges;
$this->dataPoints = $dataPoints;
$this->colors = $colors;
$this->isoBars = $isoBars;
}
 
function GetIsobarColor($val) {
for ($i = 0 ; $i < count($this->isoBars) ; $i++) {
if( $val <= $this->isoBars[$i] ) {
return $this->colors[$i];
}
}
return $this->colors[$i]; // The color for all values above the highest isobar
}
 
function Fill(ContCanvas $canvas) {
 
$nx_vertices = count($this->dataPoints[0]);
$ny_vertices = count($this->dataPoints);
 
// Loop through all squares in the grid
for($col=0; $col < $nx_vertices-1; ++$col) {
for($row=0; $row < $ny_vertices-1; ++$row) {
 
$v=array(
$this->dataPoints[$row][$col],
$this->dataPoints[$row][$col+1],
$this->dataPoints[$row+1][$col+1],
$this->dataPoints[$row+1][$col],
);
list($x1,$y1) = $canvas->scale->Translate($col, $row);
list($x2,$y2) = $canvas->scale->Translate($col+1, $row+1);
 
for( $x=$x1; $x < $x2; ++$x ) {
for( $y=$y1; $y < $y2; ++$y ) {
 
$v1 = $v[0] + ($v[1]-$v[0])*($x-$x1)/($x2-$x1);
$v2 = $v[3] + ($v[2]-$v[3])*($x-$x1)/($x2-$x1);
$val = $v1 + ($v2-$v1)*($y-$y1)/($y2-$y1);
 
if( $row==2 && $col==2 ) {
//echo " ($val ($x,$y)) (".$v[0].",".$v[1].",".$v[2].",".$v[3].")<br>";
}
$color = $this->GetIsobarColor($val);
$canvas->g->img->SetColor($color);
$canvas->g->img->Point($x, $y);
}
}
}
}
 
}
 
}
 
$edges=array(array(),array(),array());
$datapoints=array();
for($col=0; $col<6; $col++) {
for($row=0; $row<6; $row++) {
$datapoints[$row][$col]=0;
$edges[VERT_EDGE][$row][$col] = false;
$edges[HORIZ_EDGE][$row][$col] = false;
}
}
 
$datapoints[1][2] = 2;
$datapoints[2][1] = 1;
$datapoints[2][2] = 7;
$datapoints[2][3] = 2;
$datapoints[3][1] = 2;
$datapoints[3][2] = 17;
$datapoints[3][3] = 4;
$datapoints[4][2] = 3;
 
$datapoints[1][4] = 12;
 
$edges[VERT_EDGE][1][2] = true;
$edges[VERT_EDGE][3][2] = true;
 
$edges[HORIZ_EDGE][2][1] = true;
$edges[HORIZ_EDGE][2][2] = true;
$edges[HORIZ_EDGE][3][1] = true;
$edges[HORIZ_EDGE][3][2] = true;
 
 
 
$isobars = array(5,10,15);
$colors = array('lightgray','lightblue','lightred','red');
 
$engine = new PixelFill($edges, $datapoints, $isobars, $colors);
$canvas = new ContCanvas();
$engine->Fill($canvas);
$canvas->SetDatapoints($datapoints);
$canvas->Stroke();
die();
 
 
//$tst = new Findpolygon();
//$p1 = $tst->SetupTestData();
//
//$canvas = new ContCanvas();
//for ($i = 0 ; $i < count($tst->contourCoord); $i++) {
// $canvas->DrawLinePolygons($tst->contourCoord[$i]);
//}
//
//$p2 = $tst->FindPolygons();
//for ($i = 0 ; $i < count($p2) ; $i++) {
// $canvas->FilledPolygon($tst->flattenEdges($p2[$i]));
//}
//
//for ($i = 0 ; $i < count($p2) ; $i++) {
// $canvas->Polygon($tst->flattenEdges($p2[$i]));
//}
//
//$canvas->Stroke();
//die();
 
 
//for( $trial = 0; $trial < 1; ++$trial ) {
// echo "\nTest $trial:\n";
// echo "========================================\n";
// $tst = new Findpolygon();
// $p1 = $tst->SetupTestData();
//
// // for ($i = 0 ; $i < count($p1) ; $i++) {
// // echo "Test polygon $i:\n";
// // echo "---------------------\n";
// // $tst->p_edges($tst->contourCoord[$i]);
// // echo "\n";
// // }
// //
// $p2 = $tst->FindPolygons();
// $npol = count($p2);
// //echo "\n** Found $npol separate polygon chains.\n\n";
//
// for( $i=0; $i<$npol; ++$i ) {
//
// $res_forward = $tst->CompareCyclic($p1[$i], $p2[$i],true);
// $res_backward = $tst->CompareCyclic($p1[$i], $p2[$i],false);
// if( $res_backward || $res_forward ) {
// // if( $res_forward )
// // echo "Forward matches!\n";
// // else
// // echo "Backward matches!\n";
// }
// else {
// echo "********** NO MATCH!!.\n\n";
// echo "\nBefore find:\n";
// for ($j = 0 ; $j < count($p1[$i]) ; $j++) {
// echo "(".$p1[$i][$j][0].','.$p1[$i][$j][1]."), ";
// }
// echo "\n";
//
// echo "\nAfter find:\n";
// for ($j = 0 ; $j < count($p2[$i]) ; $j++) {
// echo "(".$p2[$i][$j][0].','.$p2[$i][$j][1]."), ";
// }
// echo "\n";
// }
//
// }
//}
//
//echo "\n\nAll tests ready.\n\n";
//
 
 
?>